Janet implementation of Lox from the book Crafting Interpreters
at main 3.1 kB view raw
1(use judge) 2(use ../lox/interpreter) 3 4(test (evaluate [:literal false]) false) 5(test (evaluate [:unary {:token [:minus]} [:literal 1]]) -1) 6(test (evaluate [:unary {:token [:bang]} [:literal false]]) true) 7(test (evaluate [:unary {:token [:bang]} [:literal 1]]) false) 8 9(def add [:binary [:literal 1] {:token [:plus]} [:literal 2]]) 10(def concat [:binary [:literal "1"] {:token [:plus]} [:literal "2"]]) 11(test (evaluate add) 3) 12(test (evaluate [:binary add {:token [:plus]} [:literal 2]]) 5) 13(test (evaluate concat) "12") 14(test (evaluate [:binary [:literal 1] {:token [:minus]} [:literal 2]]) -1) 15 16(test-error (evaluate [:unary {:token [:minus]} [:literal ""]]) 17 "Operand must be number") 18(test-error (evaluate [:binary [:literal 1] {:token [:plus]} [:literal "2"]]) 19 "Operands must be two numbers or two strings") 20(test-error (evaluate [:binary [:literal "1"] {:token [:plus]} [:literal 2]]) 21 "Operands must be two numbers or two strings") 22(test-error (evaluate [:binary [:literal true] {:token [:plus]} [:literal true]]) 23 "Operands must be two numbers or two strings") 24(test-error (evaluate [:binary [:literal ""] {:token [:minus]} [:literal 2]]) 25 "Operands must be numbers") 26(test-error (evaluate [:binary [:literal 1] {:token [:minus]} [:literal ""]]) 27 "Operands must be numbers") 28(test-error (evaluate [:binary [:literal 1] {:token [:pow]} [:literal 2]]) 29 "Unknown operator :pow") 30 31(test (evaluate [:binary [:literal 1] {:token [:greater]} [:literal 2]]) false) 32(test (evaluate [:binary [:literal 2] {:token [:greater-eq]} [:literal 2]]) true) 33(test (evaluate [:binary [:literal "12"] {:token [:eq-eq]} concat]) true) 34(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal 1]]) true) 35(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal 2]]) false) 36(test (evaluate [:binary [:literal 1] {:token [:eq-eq]} [:literal "1"]]) false) 37 38(def nan [:binary [:literal 0] {:token [:slash]} [:literal 0]]) 39(test (evaluate [:binary nan {:token [:eq-eq]} nan]) false) 40(test (evaluate [:binary [:literal 1] {:token [:bang-eq]} [:literal 1]]) false) 41(test (evaluate [:binary [:literal 1] {:token [:bang-eq]} [:literal 2]]) true) 42(test (evaluate [:logical [:literal false] {:token [:and]} [:literal true]]) false) 43(test (evaluate [:logical [:literal false] {:token [:or]} [:literal true]]) true) 44(test (evaluate [:logical [:literal false] {:token [:or]} [:literal false]]) false) 45 46(test-stdout (execute [:print [:literal nil]]) ` 47 nil 48`) 49(test-stdout (execute [:print [:literal true]]) ` 50 true 51`) 52(test-stdout (execute [:print [:literal 1]]) ` 53 1 54`) 55(test-stdout (execute [:print [:literal 1.1]]) ` 56 1.1 57`) 58(test-stdout (execute [:print [:literal "one"]]) ` 59 one 60`) 61(test-stdout (execute [:if [:literal true] [:print [:literal 1]] nil]) ` 62 1 63`) 64(test-stdout (execute [:if [:literal true] [:print [:literal 1]] [:print [:literal 2]]]) ` 65 1 66`) 67# TODO judge fails on empty stdout 68# (test-stdout (execute [:if [:literal false] [:print [:literal 1]] nil]) "") 69(test-stdout (execute [:if [:literal false] [:print [:literal 1]] [:print [:literal 2]]]) ` 70 2 71`)