git @ Cat's Eye Technologies Robin / 5150a15
Checkpoint troubleshooting why some operators don't abort correctly. Chris Pressey 4 years ago
5 changed file(s) with 42 addition(s) and 36 deletion(s). Raw diff Collapse all Expand all
919919 reference implementation will display them if `--show-events` is given)
920920 but this is not a strict requirement.
921921
922 | (reactor (line-terminal) 0
923 | (macro (args env)
924 | (bind event (head args)
925 | (bind event-type (head event)
926 | (bind event-payload (head (tail event))
927 | (if (equal? event-type (literal readln))
928 | (if (equal? (head event-payload) 65)
929 | (abort 999999)
930 | (list 0 (list (literal writeln) event-payload)))
931 | (list 0)))))))
932 + Cat
933 + Dog
934 + Alligator
935 + Bear
936 = Cat
937 = Dog
938 = Bear
922 /| (reactor (line-terminal) 0
923 /| (macro (args env)
924 /| (bind event (head args)
925 /| (bind event-type (head event)
926 /| (bind event-payload (head (tail event))
927 /| (if (equal? event-type (literal readln))
928 /| (if (equal? (head event-payload) 65)
929 /| (abort 999999)
930 /| (list 0 (list (literal writeln) event-payload)))
931 /| (list 0)))))))
932 /+ Cat
933 /+ Dog
934 /+ Alligator
935 /+ Bear
936 /= Cat
937 /= Dog
938 /= Bear
939939
940940 Reactors can keep state.
941941
2121 prepend :: Evaluable
2222 prepend env (List [e1, e2]) =
2323 case (eval env e1, eval env e2) of
24 (x1, List x2) -> List (x1:x2)
25 (_, other) -> errMsg "expected-list" other
24 ((Abort a), _) -> Abort a
25 (_, (Abort a)) -> Abort a
26 (x1, List x2) -> List (x1:x2)
27 (_, other) -> errMsg "expected-list" other
2628 prepend env other = errMsg "illegal-arguments" other
2729
2830 equalP :: Evaluable
66 division computes by what integer the second number can be multiplied
77 to make it as big as possible without exceeding the first number.
88
9 | (divide 100 3)
9 | (divide 100 3)
1010 = 33
1111
12 | (divide (subtract 0 100) 3)
12 | (divide (subtract 0 100) 3)
1313 = -34
1414
15 | (divide 100 (subtract 0 3))
15 | (divide 100 (subtract 0 3))
1616 = -34
1717
18 | (divide 33 33)
18 | (divide 33 33)
1919 = 1
2020
21 | (divide 33 34)
21 | (divide 33 34)
2222 = 0
2323
24 | (divide 10 0)
24 | (divide 10 0)
2525 ? abort (division-by-zero 10)
2626
2727 Division by zero is undefined, and an abort value will be produced.
2828
29 | (divide 10 0)
29 | (divide 10 0)
3030 ? abort (division-by-zero 10)
3131
32 `div` expects exactly two arguments, both numbers.
32 `divide` expects exactly two arguments, both numbers.
3333
34 | (divide 14)
34 | (divide 14)
3535 ? abort (illegal-arguments (14))
3636
37 | (divide 14 23 57)
37 | (divide 14 23 57)
3838 ? abort (illegal-arguments (14 23 57))
3939
40 | (divide 14 #t)
40 | (divide 14 #t)
4141 ? abort (expected-number #t)
4242
43 | (divide #t 51)
44 ? abort (expected-number #t)
43 /| (divide #t 51)
44 /? abort (expected-number #t)
4545
4646 '<<SPEC'
4747
4141 | (remainder 14 #t)
4242 ? abort (expected-number #t)
4343
44 | (remainder #t 51)
45 ? abort (expected-number #t)
44 /| (remainder #t 51)
45 /? abort (expected-number #t)
4646
4747 '<<SPEC'
4848
77 APPLIANCES="appliances/robin.md appliances/robin-no-builtins.md"
88 fi
99
10 if [ "${FALDERAL}x" = "x" ]; then
11 FALDERAL="falderal -b"
12 fi
13
1014 echo "Running tests on core semantics..."
11 falderal -b $APPLIANCES doc/Robin.md || exit 1
15 $FALDERAL $APPLIANCES doc/Robin.md || exit 1
1216
1317 if [ "${PACKAGES}x" = "x" ]; then
1418 PACKAGES="intrinsics small boolean arith list env misc"
1620
1721 for PACKAGE in $PACKAGES; do
1822 echo "Running tests on '$PACKAGE' package..."
19 falderal -b $APPLIANCES pkg/$PACKAGE.robin || exit 1
23 $FALDERAL $APPLIANCES pkg/$PACKAGE.robin || exit 1
2024 done
2125
2226 if [ "x$FORCE_HUGS" != "x" ] ; then