213 lines
6.0 KiB
Plaintext
213 lines
6.0 KiB
Plaintext
(module main)
|
|
|
|
(enum Status Ready Blocked)
|
|
|
|
(struct Pair
|
|
(left i32)
|
|
(right i32))
|
|
|
|
(struct CompositeRecord
|
|
(ints (vec i32))
|
|
(wides (vec i64))
|
|
(ratios (vec f64))
|
|
(flags (vec bool))
|
|
(labels (vec string))
|
|
(maybe_count (option i32))
|
|
(maybe_wide (option i64))
|
|
(maybe_ratio (option f64))
|
|
(maybe_flag (option bool))
|
|
(maybe_label (option string))
|
|
(count_result (result i32 i32))
|
|
(wide_result (result i64 i32))
|
|
(ratio_result (result f64 i32))
|
|
(flag_result (result bool i32))
|
|
(label_result (result string i32))
|
|
(pair Pair)
|
|
(status Status))
|
|
|
|
(fn make_pair ((left i32) (right i32)) -> Pair
|
|
(Pair (left left) (right right)))
|
|
|
|
(fn vec_i32_pair ((base i32)) -> (vec i32)
|
|
(let values (vec i32) (std.vec.i32.empty))
|
|
(let first (vec i32) (std.vec.i32.append values base))
|
|
(std.vec.i32.append first (+ base 1)))
|
|
|
|
(fn vec_i64_pair ((base i64)) -> (vec i64)
|
|
(let values (vec i64) (std.vec.i64.empty))
|
|
(let first (vec i64) (std.vec.i64.append values base))
|
|
(std.vec.i64.append first (+ base 1i64)))
|
|
|
|
(fn vec_f64_pair ((base f64)) -> (vec f64)
|
|
(let values (vec f64) (std.vec.f64.empty))
|
|
(let first (vec f64) (std.vec.f64.append values base))
|
|
(std.vec.f64.append first (+ base 1.0)))
|
|
|
|
(fn vec_bool_pair ((first bool) (second bool)) -> (vec bool)
|
|
(let values (vec bool) (std.vec.bool.empty))
|
|
(let left (vec bool) (std.vec.bool.append values first))
|
|
(std.vec.bool.append left second))
|
|
|
|
(fn vec_string_pair ((first string) (second string)) -> (vec string)
|
|
(let values (vec string) (std.vec.string.empty))
|
|
(let left (vec string) (std.vec.string.append values first))
|
|
(std.vec.string.append left second))
|
|
|
|
(fn make_record () -> CompositeRecord
|
|
(CompositeRecord (ints (vec_i32_pair 10)) (wides (vec_i64_pair 100i64)) (ratios (vec_f64_pair 3.5)) (flags (vec_bool_pair false true)) (labels (vec_string_pair "oak" "elm")) (maybe_count (some i32 7)) (maybe_wide (some i64 7000000000i64)) (maybe_ratio (some f64 7.5)) (maybe_flag (some bool true)) (maybe_label (some string "alpha")) (count_result (ok i32 i32 9)) (wide_result (ok i64 i32 9000000000i64)) (ratio_result (ok f64 i32 9.25)) (flag_result (ok bool i32 true)) (label_result (ok string i32 "beta")) (pair (make_pair 20 22)) (status (Status.Ready))))
|
|
|
|
(fn echo_record ((record CompositeRecord)) -> CompositeRecord
|
|
record)
|
|
|
|
(fn local_record () -> CompositeRecord
|
|
(let record CompositeRecord (make_record))
|
|
(echo_record record))
|
|
|
|
(fn ints_second ((record CompositeRecord)) -> i32
|
|
(std.vec.i32.index (. record ints) 1))
|
|
|
|
(fn wides_second ((record CompositeRecord)) -> i64
|
|
(std.vec.i64.index (. record wides) 1))
|
|
|
|
(fn ratios_second ((record CompositeRecord)) -> f64
|
|
(std.vec.f64.index (. record ratios) 1))
|
|
|
|
(fn flags_second ((record CompositeRecord)) -> bool
|
|
(std.vec.bool.index (. record flags) 1))
|
|
|
|
(fn labels_second ((record CompositeRecord)) -> string
|
|
(std.vec.string.index (. record labels) 1))
|
|
|
|
(fn maybe_count_value ((record CompositeRecord)) -> i32
|
|
(match (. record maybe_count)
|
|
((some payload)
|
|
payload)
|
|
((none)
|
|
0)))
|
|
|
|
(fn maybe_wide_value ((record CompositeRecord)) -> i64
|
|
(match (. record maybe_wide)
|
|
((some payload)
|
|
payload)
|
|
((none)
|
|
0i64)))
|
|
|
|
(fn maybe_ratio_value ((record CompositeRecord)) -> f64
|
|
(match (. record maybe_ratio)
|
|
((some payload)
|
|
payload)
|
|
((none)
|
|
0.0)))
|
|
|
|
(fn maybe_flag_value ((record CompositeRecord)) -> bool
|
|
(match (. record maybe_flag)
|
|
((some payload)
|
|
payload)
|
|
((none)
|
|
false)))
|
|
|
|
(fn maybe_label_value ((record CompositeRecord)) -> string
|
|
(match (. record maybe_label)
|
|
((some payload)
|
|
payload)
|
|
((none)
|
|
"missing")))
|
|
|
|
(fn count_result_value ((record CompositeRecord)) -> i32
|
|
(match (. record count_result)
|
|
((ok payload)
|
|
payload)
|
|
((err code)
|
|
code)))
|
|
|
|
(fn wide_result_value ((record CompositeRecord)) -> i64
|
|
(match (. record wide_result)
|
|
((ok payload)
|
|
payload)
|
|
((err code)
|
|
0i64)))
|
|
|
|
(fn ratio_result_value ((record CompositeRecord)) -> f64
|
|
(match (. record ratio_result)
|
|
((ok payload)
|
|
payload)
|
|
((err code)
|
|
0.0)))
|
|
|
|
(fn flag_result_value ((record CompositeRecord)) -> bool
|
|
(match (. record flag_result)
|
|
((ok payload)
|
|
payload)
|
|
((err code)
|
|
false)))
|
|
|
|
(fn label_result_value ((record CompositeRecord)) -> string
|
|
(match (. record label_result)
|
|
((ok payload)
|
|
payload)
|
|
((err code)
|
|
"missing")))
|
|
|
|
(fn pair_total ((record CompositeRecord)) -> i32
|
|
(+ (. (. record pair) left) (. (. record pair) right)))
|
|
|
|
(fn is_ready ((record CompositeRecord)) -> bool
|
|
(= (. record status) (Status.Ready)))
|
|
|
|
(test "struct vec i32 field access"
|
|
(= (ints_second (make_record)) 11))
|
|
|
|
(test "struct vec i64 field access"
|
|
(= (wides_second (make_record)) 101i64))
|
|
|
|
(test "struct vec f64 field access"
|
|
(= (ratios_second (make_record)) 4.5))
|
|
|
|
(test "struct vec bool field access"
|
|
(flags_second (make_record)))
|
|
|
|
(test "struct vec string field access"
|
|
(= (labels_second (make_record)) "elm"))
|
|
|
|
(test "struct option i32 field access"
|
|
(= (maybe_count_value (make_record)) 7))
|
|
|
|
(test "struct option i64 field access"
|
|
(= (maybe_wide_value (make_record)) 7000000000i64))
|
|
|
|
(test "struct option f64 field access"
|
|
(= (maybe_ratio_value (make_record)) 7.5))
|
|
|
|
(test "struct option bool field access"
|
|
(maybe_flag_value (make_record)))
|
|
|
|
(test "struct option string field access"
|
|
(= (maybe_label_value (make_record)) "alpha"))
|
|
|
|
(test "struct result i32 field access"
|
|
(= (count_result_value (make_record)) 9))
|
|
|
|
(test "struct result i64 field access"
|
|
(= (wide_result_value (make_record)) 9000000000i64))
|
|
|
|
(test "struct result f64 field access"
|
|
(= (ratio_result_value (make_record)) 9.25))
|
|
|
|
(test "struct result bool field access"
|
|
(flag_result_value (make_record)))
|
|
|
|
(test "struct result string field access"
|
|
(= (label_result_value (make_record)) "beta"))
|
|
|
|
(test "nested struct field access"
|
|
(= (pair_total (make_record)) 42))
|
|
|
|
(test "nested struct local param return call flow"
|
|
(= (pair_total (local_record)) 42))
|
|
|
|
(test "direct enum struct field equality"
|
|
(is_ready (make_record)))
|
|
|
|
(fn main () -> i32
|
|
(pair_total (local_record)))
|