newLISP 入门/调试器
本节简要介绍内置调试器。
关键函数是 trace。 要启动和停止调试器,使用 true 或 nil
(trace true) ; start debugging
(trace nil) ; stop debugging
不带参数使用时,如果调试器当前处于活动状态,则返回 true。
trace-highlight 命令允许你控制当前正在评估的表达式的显示方式,以及一些提示。 我正在使用一个与 VT100 兼容的终端,因此可以使用奇怪的转义序列来设置颜色。 在 newLISP 提示符下输入以下内容
(trace-highlight "\027[0;37m" "\027[0;0m")
但由于我永远记不住这个,它在我的 .init.lsp 文件中,该文件在启动 newLISP 时加载。 如果你不能使用这些序列,你可以使用普通字符串代替。
另一个调试函数是 debug。 这实际上只是切换跟踪打开、在调试器中运行函数,然后再次切换跟踪关闭的快捷方式。 因此,假设我们要运行一个名为 old-file-scanner.lsp 的文件,其中包含以下代码
(define (walk-tree folder)
(dolist (item (directory folder))
(set 'item-name (string folder "/" item))
(if (and (not (starts-with item ".")) (directory? item-name))
; folder
(walk-tree item-name)
; file
(and
(not (starts-with item "."))
(set 'f-name (real-path item-name))
(set 'mtime (file-info f-name 6))
(if
(> (- (date-value) mtime) (* 5 365 24 60 60)) ; non-leap years :)
(push (list mtime item-name) results))))))
(set 'results '())
(walk-tree {/usr/share})
(map (fn (i) (println (date (first i)) { } (last i))) (sort results))
这会扫描目录和子目录,查找 5 年或更长时间前修改过的文件。(请注意,该文件以将在加载文件时立即评估的表达式结束。) 首先,打开跟踪
(trace true)
然后加载并开始调试
(load {old-file-scanner.lsp})
或者,代替这两行,输入这一行
(debug (load {old-file-scanner.lsp}))
无论哪种方式,你都会看到 walk-tree 函数中的第一个表达式突出显示,等待评估。
现在,你可以按 s、n 或 c 键(步骤、下一步和继续)来执行你的函数:步骤评估每个表达式,并在调用其他函数时进入其他函数;下一步评估所有内容,直到到达同一级别的下一个表达式;继续运行而不再次停止。
如果你很聪明,你可以在想要开始调试的地方之前放置一个 (trace true) 表达式。 如果可能,newLISP 将在该表达式之前停止,并向你显示它即将评估的函数。 在这种情况下,你可以使用简单的 (load...) 表达式开始执行脚本 - 如果你想跳过脚本的初步部分,不要使用 debug。 我认为 newLISP 通常更喜欢在函数或函数调用的开头进入调试器 - 你可能无法在执行过程中进入函数。 但你可能会设法组织事情,以便你可以做类似的事情。
以下是如何在循环中间进入调试器。 这是一小部分代码
(set 'i 0)
(define (f1)
(inc i))
(define (f2)
(dotimes (x 100)
(f1)
(if (= i 50) (trace true))))
(f2)
从文件加载它
> (load {simpleloop.lsp}) ----- (define (f1) (inc i)) [-> 5 ] s|tep n|ext c|ont q|uit > i 50 [-> 5 ] s|tep n|ext c|ont q|uit >
注意函数 f1 如何出现 - 你没有机会在 f2 中看到任何东西。 在调试器提示符下,你可以输入任何新的 LISP 表达式,并评估任何函数。 在这里,我输入了 i 来查看该符号的当前值。 newLISP 很乐意让你更改某些符号的值。 例如,你应该能够更改循环变量。 但不要重新定义任何函数... 如果你试图从 newLISP 的脚下拉走地毯,你可能会成功地让它摔倒!
调试器显示的源代码不包括注释,因此如果你想在查看代码时留下有用的备注或灵感,请使用文本字符串而不是注释
(define (f1)
[text]This will appear in the debugger.[/text]
; But this won't.
(inc i))