1
0
Fork 0
forked from fun/fun
fun/examples/conversions_showcase.fun

163 lines
3.4 KiB
Standard ML
Executable file

#!/usr/bin/env fun
/*
* This file is part of the Fun programming language.
* https://fun-lang.xyz/
*
* Copyright 2025 Johannes Findeisen
* Licensed under the terms of the Apache-2.0 license.
* https://opensource.org/license/apache-2-0
*
* Added: 2025-12-13
*/
// conversions_showcase.fun
// Demonstrates Fun's data type conversion features:
// - to_number(x)
// - to_string(x)
// - cast(value, typeName)
// - typeof(x)
// - uclamp(number, bits), sclamp(number, bits)
print("=== Conversions showcase ===")
// typeof on core literals
print("typeof(123) -> " + typeof(123)) // Number
print("typeof(\"abc\") -> " + typeof("abc")) // String
print("typeof([1,2]) -> " + typeof([1,2])) // Array
// Use a variable for map to avoid parser ambiguities
mm = { "a": 1 }
print("typeof({\"a\":1}) -> " + typeof(mm)) // Map
print("typeof(0) -> " + typeof(0)) // Number (Boolean is 0/1 as Number)
print("typeof(nil) -> " + typeof(nil)) // Nil
print("")
print("-- to_number(x) --")
print(to_number(42)) // 42
print(to_number("123")) // 123
print(to_number("12x")) // 0 (invalid -> 0)
print(to_number(0)) // 0
print(to_number(1)) // 1
print("")
print("-- to_string(x) --")
print(to_string(42)) // "42"
print(to_string("hi")) // "hi"
print(to_string([1,2,3])) // "[array n=3]" or similar representation
print(to_string({ "k": 7 })) // "{\"k\":7}" or implementation-defined
print(to_string(nil)) // "nil" (implementation-defined)
print("")
print("-- cast(value, typeName) --")
// Number: parse decimals; invalid -> 0
print(cast("123", "Number"))
print(cast("12x", "Number"))
// String: stringify
print(cast(100, "String"))
print(typeof(cast(100, "String")))
// Boolean: 0 -> 0, non-zero -> 1
print(cast(0, "Boolean"))
print(cast(42, "Boolean"))
// Array: others get wrapped
a = cast(42, "Array")
print(typeof(a))
print(len(a))
print(a[0])
// Map: non-maps become empty map
m = cast(42, "Map")
print(typeof(m))
// Nil: always Nil
n = cast("x", "Nil")
print(typeof(n))
// Function: non-functions -> Nil
fun foo()
return 7
print(typeof(cast(foo, "Function")))
print(typeof(cast(42, "Function")))
print("")
print("-- Integer width ranges via typed variables --")
// Unsigned 8-bit: values clamped to [0..255]
uint8 u8 = 0
u8 = 255
print(u8) // -> 255
// u8 = -1 // Uncomment to see OverflowError: value out of range for uint8
// u8 = 300 // Uncomment to see OverflowError: value out of range for uint8
// Signed 8-bit: values clamped to [-128..127]
int8 s8 = 0
s8 = -128
print(s8) // -> -128
s8 = 127
print(s8) // -> 127
// s8 = -200 // Uncomment to see OverflowError for int8
// s8 = 200 // Uncomment to see OverflowError for int8
// 16-bit examples
uint16 u16 = 0
u16 = 65535
print(u16) // -> 65535
// u16 = 70000 // Uncomment to see OverflowError for uint16
int16 s16 = 0
s16 = -32768
print(s16) // -> -32768
s16 = 32767
print(s16) // -> 32767
print("=== Done ===")
/* Expected output:
=== Conversions showcase ===
typeof(123) -> Number
typeof("abc") -> String
typeof([1,2]) -> Array
typeof({"a":1}) -> String
typeof(0) -> Number
typeof(nil) -> Nil
-- to_number(x) --
42
123
0
0
1
-- to_string(x) --
42
hi
[array n=3]
{map n=1}
nil
-- cast(value, typeName) --
123
0
100
String
0
1
Array
1
42
String
Nil
Function
Nil
-- Integer width ranges via typed variables --
255
-128
127
65535
-32768
32767
=== Done ===
*/