163 lines
3.4 KiB
Standard ML
Executable file
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 ===
|
|
*/
|