diff --git a/Makefile b/Makefile index 2a324c4..7d48c45 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,7 @@ LUA = lua5.4 -TEST_FILES = $(wildcard test_*.lua) +TEST_LUA_FILES = $(wildcard test_*.lua) +TEST_EQX_FILES = $(wildcard test_*.eqx) +EQUINOX = equinox.lua REPL = repl.lua ifeq ($(shell command -v $(LUA) 2>/dev/null),) @@ -11,10 +13,17 @@ all: test test: @echo "Running Lua tests..." - @for file in $(TEST_FILES); do \ + @for file in $(TEST_LUA_FILES); do \ echo "Running $$file..."; \ $(LUA) $$file || exit 1; \ done + + @echo "Running Equinox tests..." + @for file in $(TEST_EQX_FILES); do \ + echo "Running $$file..."; \ + $(LUA) $(EQUINOX) $$file || exit 1; \ + done + @echo "All tests passed!" repl: diff --git a/dict.lua b/dict.lua index 233d8f9..7664c65 100644 --- a/dict.lua +++ b/dict.lua @@ -35,6 +35,7 @@ dict.defword("or", "ops._or", false) dict.defword("..", "ops.concat", false) dict.defword(">a", "ops.to_aux", false) dict.defword("a>", "ops.from_aux", false) +dict.defword("assert", "ops.assert", false) dict.defword("if", "macros._if", true) dict.defword("then", "macros._then", true) dict.defword("else", "macros._else", true) diff --git a/equinox.lua b/equinox.lua new file mode 100644 index 0000000..c05439f --- /dev/null +++ b/equinox.lua @@ -0,0 +1,11 @@ +compiler = require("compiler") + +if #arg < 1 then + print("Usage: lua equinox.lua ") + os.exit(1) +end + +local filename = arg[1] + +compiler:eval_file("lib.eqx") +compiler:eval_file(filename) diff --git a/macros.lua b/macros.lua index 67d0143..08e4354 100644 --- a/macros.lua +++ b/macros.lua @@ -10,7 +10,34 @@ end function macros.colon(compiler) local alias = compiler:word() - local name = "w_" .. string.gsub(alias, "-", "_minus_") + local name = "w_" .. + alias:gsub("-", "_mi_") + :gsub("%+", "_pu_") + :gsub("%%", "_pe_") + :gsub("/", "_fs_") + :gsub("\\", "_bs_") + :gsub("~", "_ti_") + :gsub("#", "_hs_") + :gsub("%*", "_sr_") + :gsub(";", "_sc_") + :gsub("&", "_an_") + :gsub("|", "_or_") + :gsub("@", "_at_") + :gsub("`", "_bt_") + :gsub("=", "_eq_") + :gsub("'", "_sq_") + :gsub('"', "_dq_") + :gsub("?", "_qe_") + :gsub("!", "_ex_") + :gsub(",", "_ca_") + :gsub(":", "_cm_") + :gsub("%.", "_dt_") + :gsub("%{", "_c1_") + :gsub("%}", "_c2_") + :gsub("%[", "_b1_") + :gsub("%]", "_b2_") + :gsub("%(", "_p1_") + :gsub("%(", "_p2_") compiler:defword(alias, name, false) compiler:emit_line("function " .. name .. "()") end diff --git a/test_compiler.lua b/test_compiler.lua index 8adf8b9..de4fccb 100644 --- a/test_compiler.lua +++ b/test_compiler.lua @@ -1,6 +1,5 @@ local compiler = require("compiler") -compiler.trace = true compiler:eval_file("lib.eqx") function assert_tos(result, code) @@ -13,207 +12,7 @@ function assert_tos(result, code) stack:pop() end --- arithmetics - add -assert_tos(3, "1 2 +") -assert_tos(33, "0 33 +") -assert_tos(-6, "-2 -4 +") -assert_tos(-17, "-21 4 +") -assert_tos(140, "145 -5 +") -assert_tos(5.8, "3.3 2.5 +") --- arithmetics - sub -assert_tos(1, "2 1 -") -assert_tos(-33, "0 33 -") -assert_tos(2, "-2 -4 -") -assert_tos(-25, "-21 4 -") -assert_tos(150, "145 -5 -") -assert_tos(10, "11.5 1.5 -") --- arithmetics - mul -assert_tos(6, "2 3 *") -assert_tos(0, "0 33 *") -assert_tos(8, "-2 -4 *") -assert_tos(-300, "100 -3 *") -assert_tos(10, "2.5 4 *") -assert_tos(6.25, "2.5 2.5 *") --- arithmetics - div -assert_tos(5, "10 2 /") -assert_tos(0.2, "2 10 /") -assert_tos(2, "-4 -2 /") -assert_tos(-2, "6 -3 /") -assert_tos(2.5, "10 4 /") -assert_tos(1, "2.5 2.5 /") --- arithmetics - eq -assert_tos(true, "5 5 =") -assert_tos(false, "6 5 =") -assert_tos(true, "-6 -6 =") -assert_tos(false, "6 -6 =") --- arithmetics - jeq -assert_tos(false, "5 5 !=") -assert_tos(true, "6 5 !=") -assert_tos(false, "-6 -6 !=") -assert_tos(true, "6 -6 !=") --- arithmetics - lt -assert_tos(false, "5 5 <") -assert_tos(false, "6 5 <") -assert_tos(false, "-6 -6 <") -assert_tos(false, "6 -6 <") -assert_tos(true, "3 5 <") -assert_tos(true, "-1 5 <") -assert_tos(true, "-6 -2 <") --- booleans - not -assert_tos(true, "false not") -assert_tos(false, "true not") -assert_tos(true, "true not not") --- booleans - and -assert_tos(true, "true true and") -assert_tos(false, "true false and") -assert_tos(false, "false true and") -assert_tos(false, "false false and") --- booleans - or -assert_tos(true, "true true or") -assert_tos(true, "true false or") -assert_tos(true, "false true or") -assert_tos(false, "false false or") --- arithmetics - gt -assert_tos(false, "5 5 >") -assert_tos(true, "6 5 >") -assert_tos(false, "-6 -6 >") -assert_tos(true, "6 -6 >") -assert_tos(false, "3 5 >") -assert_tos(false, "-1 5 >") -assert_tos(false, "-6 -2 >") --- arithmetics - lte -assert_tos(true, "5 5 <=") -assert_tos(false, "6 5 <=") -assert_tos(true, "-6 -6 <=") -assert_tos(false, "6 -6 <=") -assert_tos(true, "3 5 <=") -assert_tos(true, "-1 5 <=") -assert_tos(true, "-6 -2 <=") --- arithmetics - gte -assert_tos(true, "5 5 >=") -assert_tos(true, "6 5 >=") -assert_tos(true, "-6 -6 >=") -assert_tos(true, "6 -6 >=") -assert_tos(false, "3 5 >=") -assert_tos(false, "-1 5 >=") -assert_tos(false, "-6 -2 >=") - --- stack - dup -assert_tos(10, "5 5 +") --- stack - swap -assert_tos(3, "7 10 swap -") --- stack - over -assert_tos(2, "1 2 over - +") --- stack - rot -assert_tos(1, "1 2 3 rot nip nip") -assert_tos(3, "1 2 3 rot drop nip") -assert_tos(2, "1 2 3 rot drop drop") --- stack - -rot -assert_tos(2, "1 2 3 -rot nip nip") -assert_tos(1, "1 2 3 -rot drop nip") -assert_tos(3, "1 2 3 -rot drop drop") --- stack - tuck -assert_tos(2, "1 2 tuck nip nip") -assert_tos(1, "1 2 tuck drop nip") -assert_tos(2, "1 2 tuck drop drop") - --- control if -assert_tos(8, "1 2 < if 8 then") -assert_tos(4, "1 2 > if 8 else 4 then") - --- control begin until -assert_tos(2048, "2 10 begin 1 - swap 2 * swap dup 0 = until drop") - --- def : -assert_tos(42, ": tst 42 ; tst") -assert_tos(6, ": dbl dup + ; 3 dbl") - -compiler:eval(": min ( n n -- n ) 2dup < if drop else nip then ;") -assert_tos(4, "4 6 min") -assert_tos(2, "5 2 min") - --- max -compiler:eval(": max ( n n -- n ) 2dup < if nip else drop then ;") -assert_tos(6, "4 6 max") -assert_tos(5, "5 2 max") - -assert_tos(5, [[ -\ 1 2 + - \ 1 1 * - \ 3 4 + - 3 2 + -\ this is a comment -]]) - -assert_tos(5, [[ -( 1 2 + - 1 1 * - 3 4 + ) - 3 2 + -( this is a comment) -]]) - --- var local -assert_tos(22, [[ - var v1 - var v2 - 10 -> v1 - 12 -> v2 - v1 v2 + -]]) - --- var local -assert_tos(-3, [[ - var v1 - var v2 - 10 -> v1 v1 -> v2 - 3 v2 + -> v2 ( 13 = v2 ) - v1 v2 - ( 10 13 - ) -]]) - --- var global -assert_tos(12, [[ - 3 -> v1 - 4 -> v2 - v1 v2 * -]]) - -assert_tos(3, [[:xyz string.len/1]]) - -assert_tos(4, [["asdf" string.len/1]]) -assert_tos(9, [["asdf jkle" string.len/1]]) -assert_tos(10, [["asdf jkle " string.len/1]]) -assert_tos(10, [[" asdf jkle" string.len/1]]) -assert_tos(11, [[" asdf jkle " string.len/1]]) -assert_tos(0, [["" string.len/1]]) -assert_tos(1, [[" " string.len/1]]) -assert_tos(2, [[" " string.len/1]]) -assert_tos(14, [[" asdf jkle " string.len/1]]) - -assert_tos(" abc xyz ", [[ -" abc " -" xyz " -.. -]]) - -assert_tos(256, [[ - 8 2 math.pow/2 -]]) - -assert_tos(502, [[ - 502 1002 math.min/2 -]]) -assert_tos(1002, [[ - 502 1002 math.max/2 -]]) - -assert_tos(502, [[ - 502 1002 math.min/2 -]]) - -assert_tos(0, [[ - 1 2 >a 3 a> - - -]]) +assert_tos(2, "1 2 math.max/2") local status, result = pcall( function() diff --git a/test_core.eqx b/test_core.eqx new file mode 100644 index 0000000..7b0b360 --- /dev/null +++ b/test_core.eqx @@ -0,0 +1,198 @@ +: assert-true assert/1 drop ; +: assert-false not assert-true ; +: =assert = assert-true ; + +0 1 - -1 =assert +-10 1 + -9 =assert +-10 4 < assert-true +-10 -4 < assert-true +324 12 > assert-true +-24 -212 > assert-true +24 -2 > assert-true +1 1 - 0 =assert +-1 1 + 0 =assert + +1 2 + 3 =assert +0 33 + 33 =assert +-2 -4 + -6 =assert +-21 4 + -17 =assert +145 -5 + 140 =assert +3.3 2.5 + 5.8 =assert + +2 1 - 1 =assert +0 33 - -33 =assert +-2 -4 - 2 =assert +-21 4 - -25 =assert +145 -5 - 150 =assert +11.5 1.5 - 10 =assert + +2 3 * 6 =assert +0 33 * 0 =assert +-2 -4 * 8 =assert +100 -3 * -300 =assert +2.5 4 * 10 =assert +2.5 2.5 * 6.25 =assert + +10 2 / 5 =assert +2 10 / 0.2 =assert +-4 -2 / 2 =assert +6 -3 / -2 =assert +10 4 / 2.5 =assert +2.5 2.5 / 1 =assert + +5 5 =assert +6 5 = assert-false +-6 -6 =assert +6 -6 = assert-false + +5 5 != assert-false +6 5 != assert-true +-6 -6 != assert-false +6 -6 != assert-true + +5 5 < assert-false +6 5 < assert-false +-6 -6 < assert-false +6 -6 < assert-false +3 5 < assert-true +-1 5 < assert-true +-6 -2 < assert-true + +5 5 > assert-false +6 5 > assert-true +-6 -6 > assert-false +6 -6 > assert-true +3 5 > assert-false +-1 5 > assert-false +-6 -2 > assert-false + +5 5 <= assert-true +6 5 <= assert-false +-6 -6 <= assert-true +6 -6 <= assert-false +3 5 <= assert-true +-1 5 <= assert-true +-6 -2 <= assert-true + +5 5 >= assert-true +6 5 >= assert-true +-6 -6 >= assert-true +6 -6 >= assert-true +3 5 >= assert-false +-1 5 >= assert-false +-6 -2 >= assert-false + +false assert-false +true assert-true +true not not assert-true +false not not not assert-true + +true true and assert-true +true false and assert-false +false true and assert-false +false false and assert-false + +true true or assert-true +true false or assert-true +false true or assert-true +false false or assert-false + +5 dup + 10 =assert +7 10 swap - 3 =assert + +1 2 over - + 2 =assert +3 4 over +3 =assert +4 =assert +3 =assert + +1 2 nip +2 =assert +depth 0 =assert + +1 2 3 rot ( 2 3 1 ) +1 =assert +3 =assert +2 =assert + +1 2 3 -rot ( 3 1 2 ) +2 =assert +1 =assert +3 =assert + +1 2 tuck ( 2 1 2 ) +2 =assert +1 =assert +2 =assert + +1 2 2dup ( 1 2 1 2 ) +2 =assert +1 =assert +2 =assert +1 =assert + +1 2 < if 8 then 8 =assert +1 2 > if 8 else 4 then 4 =assert + +2 10 begin 1 - swap 2 * swap dup 0 = until drop 2048 =assert + +: tst 42 ; tst 42 =assert +: dbl dup + ; 3 dbl 6 =assert + +\ 1 2 + + \ 1 1 * + \ 3 4 + + 3 2 + +\ this is a comment +5 =assert +depth 0 =assert + +( 1 2 + + 1 1 * + 3 4 + ) + 3 2 + +( this is a comment) +5 =assert +depth 0 =assert + +var v1 +var v2 +10 -> v1 +12 -> v2 +v1 v2 + +22 =assert + +var v1 +var v2 +10 -> v1 v1 -> v2 +3 v2 + -> v2 ( 13 = v2 ) +v1 v2 - ( 10 13 - ) +-3 =assert + +:xyz string.len/1 3 =assert + +"asdf" string.len/1 4 =assert +"asdf jkle" string.len/1 9 =assert +"asdf jkle " string.len/1 10 =assert +" asdf jkle" string.len/1 10 =assert +" asdf jkle " string.len/1 11 =assert +"" string.len/1 0 =assert +" " string.len/1 1 =assert +" " string.len/1 2 =assert +" asdf jkle " string.len/1 14 =assert + +" abc " " xyz " .. " abc xyz " =assert + +8 2 math.pow/2 256 =assert + +502 1002 math.min/2 502 =assert +502 1002 math.max/2 1002 =assert + +502 1002 math.min/2 502 =assert + +1 2 >a 3 a> - - 0 =assert + +: *2 2 * ; 10 *2 20 =assert +: /2 2 / ; 10 /2 5 =assert + +depth 0 =assert