git @ Cat's Eye Technologies Decoy / c0e5dcf
Checkpoint moving towards non-sexpr representation of toplevels. Chris Pressey 1 year, 4 months ago
5 changed file(s) with 52 addition(s) and 7 deletion(s). Raw diff Collapse all Expand all
33
44 require "decoy_model"
55
6
67 local Define = {}
8
9 function Define:depict()
10 return "(define " .. tostring(name) .. ": " .. tostring(defn) .. ")"
11 end
12
13 Define.is_class_of = function(obj)
14 local mt = getmetatable(obj)
15 return mt and mt.__index == Define
16 end
717
818 Define.new = function(name, defn)
919 local self = {
1424 return self
1525 end
1626
27
1728 local ImportFrom = {}
29
30 function ImportFrom:depict()
31 return "(import-from " .. tostring(name) .. ": " .. tostring(import_list) .. ")"
32 end
33
34 ImportFrom.is_class_of = function(obj)
35 local mt = getmetatable(obj)
36 return mt and mt.__index == ImportFrom
37 end
1838
1939 ImportFrom.new = function(name, import_list)
2040 local self = {
8181 end
8282 end
8383
84 function Compiler:compile_print_expr(sexp, env)
85 self:emit("console.log(")
86 self:compile_expr(sexp, env)
87 self:emit(");\n")
88 end
89
8490 --[[ toplevels ]]--
8591
8692 function Compiler:compile_import_from(ast, env)
101101 return tostring(sexp:value())
102102 elseif Boolean.is_class_of(sexp) then
103103 if sexp:value() then return "#t" else return "#f" end
104 elseif sexp.depict then
105 return sexp:depict()
104106 else
105107 error("Invalid lua representation of s-expression: " .. render(sexp) .. ": " .. type(sexp))
106108 end
6363 scanner:consume_type("symbol")
6464 local defn = self:parse_sexp()
6565 scanner:expect(")")
66 e = ast.new_Define(name, defn)
67 --elseif scanner:consume("import-from") then
68 -- error("You said *import-from")
69 -- scanner:expect(")")
66 e = ast.Define.new(name, defn)
67 elseif scanner:consume("import-from") then
68 assert(scanner:get_token_type() == "strlit")
69 local name = scanner:get_token_text()
70 scanner:consume_type("strlit")
71 local import_list = self:parse_sexp()
72 scanner:expect(")")
73 e = ast.ImportFrom.new(name, import_list)
7074 else
7175 local es = self:parse_sexps()
7276 scanner:expect(")")
66
77
88 require "decoy_model"
9 local ast = require "decoy_ast"
910 local envi = require "decoy_env"
1011 local Parser = require "decoy_parser"
1112 local Desugarer = require "decoy_desugar"
4142 --
4243 local process_toplevel = function(registry, expr, env, module, expr_processor)
4344 debug("module", "_process_toplevel: " .. depict(expr))
44 if Cons.is_class_of(expr) then
45 if ast.Define.is_class_of(expr) then
46 local dvalue = registry.evaluator:eval_expr(expr.defn, env)
47 env = envi.bind(expr.name, dvalue, env)
48 module[name:text()] = dvalue
49 elseif ast.ImportFrom.is_class_of(expr) then
50 do_debug("module", function()
51 print("import_from", env, registry, expr.name, depict(expr.import_list))
52 end)
53 env = registry:import_from(env, expr.name, expr.import_list)
54 elseif Cons.is_class_of(expr) then
55 -- DEPRECATED
4556 if Symbol.is_class_of(expr:head()) then
4657 if expr:head():text() == "define" then
4758 local name = expr:tail():head()
8697 local env = self.preload_env
8798
8899 local parser = Parser.new(program_text)
89 -- local exprs = parser:parse_toplevels()
100 --local exprs = parser:parse_toplevels()
90101 local exprs = parser:parse_sexps()
91102 for j, expr in ipairs(exprs) do
92103 env = process_toplevel(self, expr, env, module, expr_processor)
187198 end
188199
189200 function Registry:compile_module(program_text)
201 -- accumulate the exprs
190202 local exprs, env = self:process_module(program_text, function(expr, env) end)
191203
192 -- now compile it
204 -- now compile them
193205 local f = assert(io.open(self.output_filename, "w"))
194206 local compiler = Compiler.new(f)
195207 for j, expr in ipairs(exprs) do
196208 debug("module", "compiling: " .. depict(expr))
197209 expr = self.desugarer:desugar_expr(expr)
210 --compiler:compile_toplevel(expr, env)
198211 compiler:compile_expr(expr, env)
199212 end
200213 f:close()