git @ Cat's Eye Technologies Decoy / 7c0d89d
Fine-grained debugging facility in implementation. Chris Pressey 1 year, 9 months ago
7 changed file(s) with 38 addition(s) and 37 deletion(s). Raw diff Collapse all Expand all
131131 ----
132132
133133 * Interned strings and modules? Hash-consing, even?
134 * Debug per component of implementation (scanner, parser, evaluator, modules)
135134 * Tracebacks, or at least line/column, or at least "in function..."
136135
137136 ### Modules
1717 local registry = Registry.new()
1818 while #arg > 0 do
1919 if arg[1] == "--debug" then
20 do_debug = true
20 table.remove(arg, 1)
21 debug_what = arg[1]
2122 elseif arg[1] == "--eval" then
2223 table.remove(arg, 1)
2324 registry.eval_module(arg[1])
7575 elseif head.text() == "let*" then
7676 local bindings = ast.tail().head()
7777 local body = ast.tail().tail().head()
78 if do_debug then
78 do_debug("eval", function()
7979 print("ast:", depict(ast))
8080 print("bindings:", depict(bindings))
8181 print("body:", depict(body))
82 end
82 end)
8383 local new_env = bind_all(bindings, env)
8484 return eval_expr(body, new_env)
8585 elseif head.text() == "cond" then
109109 return f
110110 else
111111 local fn
112 if do_debug then
113 print("head Symbol:", depict(head))
114 end
112 debug("eval", "head Symbol: " .. depict(head))
115113 fn = eval_expr(ast.head(), env)
116114 local args = eval_exprs(ast.tail(), env)
117 if do_debug then
115 do_debug("eval", function()
118116 print(depict(ast.tail()))
119117 print(render_table(args))
120 end
118 end)
121119 return fn(args)
122120 end
123121 else
124122 local fn
125 if do_debug then
126 print("head:", depict(head))
127 end
123 debug("eval", "head: " .. depict(head))
128124 fn = eval_expr(ast.head(), env)
129125 return fn(eval_exprs(ast.tail(), env))
130126 end
119119 local e = Nil
120120 local i
121121 for i = #es, 1, -1 do
122 if do_debug then
122 do_debug("util", function()
123123 print("--> consing", i, depict(es[i]))
124 end
124 end)
125125 e = Cons.new(es[i], e)
126126 end
127 if do_debug then
127 do_debug("util", function()
128128 print("--> consed", depict(e))
129 end
129 end)
130130 return e
131131 end
140140 end
141141
142142 fields.eval_module_file = function(filename)
143 debug("eval_module_file: " .. filename)
143 debug("module", "eval_module_file: " .. filename)
144144 return fields.eval_module(load_file(filename))
145145 end
146146
151151 local parser = Parser.new(program_text)
152152 local exprs = parser.parse_exprs()
153153 for j, expr in ipairs(exprs) do
154 debug("eval'ing: " .. depict(expr))
154 debug("module", "eval'ing: " .. depict(expr))
155155 env = fields.eval_toplevel(expr, env, module)
156156 end
157157
158 if do_debug then
158 do_debug("module", function()
159159 for name, value in pairs(module) do
160160 print(name .. ": " .. tostring(value))
161161 end
162 end
162 end)
163163
164164 module_name = module["module"]
165165 if module_name ~= nil then
180180 elseif expr.head().text() == "import-from" then
181181 local name = expr.tail().head()
182182 local symbols = expr.tail().tail().head()
183 if do_debug then
183 do_debug("module", function()
184184 print("import_from", env, registry, depict(name), depict(symbols))
185 end
185 end)
186186 env = fields.import_from(env, name.text(), symbols)
187187 else
188188 local result = eval_expr(expr, env)
201201 fields.import_from = function(env, module_name, symbols)
202202 local imported_module = modules[module_name]
203203 if imported_module == nil and module_path ~= nil then
204 fields.load_module(module_path .. module_name .. ".scm")
204 fields.eval_module_file(module_path .. module_name .. ".scm")
205205 imported_module = modules[module_name]
206206 end
207207 if imported_module == nil then
208208 error("Could not locate module: " .. module_name)
209209 end
210 if do_debug then
210 do_debug("module", function()
211211 print("import...:", render_table(imported_module))
212 end
212 end)
213213 local symbol
214214 while symbols ~= Nil do
215215 symbol = symbols.head()
216216 symbol_name = symbol.text()
217217 symbol_value = imported_module[symbol_name]
218 if do_debug then
218 do_debug("module", function()
219219 print("imported:", symbol_name, depict(symbol_value))
220 end
220 end)
221221 env = bind(symbol, symbol_value, env)
222222 symbols = symbols.tail()
223223 end
225225 end
226226
227227 fields.compile_module_file = function(filename)
228 debug("compile_module_file: " .. filename)
228 debug("module", "compile_module_file: " .. filename)
229229 return fields.compile_module(load_file(filename))
230230 end
231231
234234 local exprs = parser.parse_exprs()
235235 local env = {}
236236 for j, expr in ipairs(exprs) do
237 debug("compiling: " .. depict(expr))
237 debug("module", "compiling: " .. depict(expr))
238238 env = fields.compile_toplevel(expr, env)
239239 end
240240 end
241241
242242 fields.compile_toplevel = function(expr, env)
243 debug("compiling toplevel: " .. depict(expr))
243 debug("module", "compiling toplevel: " .. depict(expr))
244244 --compile_expr(expr, env)
245245 return env
246246 end
6262 fields.set_token = function(text, type)
6363 _text = text
6464 _type = type
65 debug("set_token " .. text .. " (" .. type .. ")")
65 debug("scanner", "set_token " .. text .. " (" .. type .. ")")
6666 end
6767
6868 fields.scan = function()
6969 fields.scan_impl()
70 debug("scanned '" .. _text .. "' (" .. _type .. ")")
70 debug("scanner", "scanned '" .. _text .. "' (" .. _type .. ")")
7171 return _text
7272 end
7373
181181 end
182182 end
183183
184 debug("created scanner with string '" .. string .. "'")
184 debug("scanner", "created scanner with string '" .. string .. "'")
185185
186186 return fields
187187 end
22 --
33
44 table = require "table"
5 string = require "string"
56
67
78 --[[ ========== DEBUG ========= ]]--
89
9 do_debug = false
10 debug_what = ""
1011
11 debug = function(s)
12 if do_debug then
13 print("--> (" .. s .. ")")
12 do_debug = function(what, fn)
13 if string.find(debug_what, what) then
14 fn()
1415 end
16 end
17
18 debug = function(what, s)
19 do_debug(what, function() print("--> (" .. s .. ")") end)
1520 end
1621
1722 render_table = function(t)