跳转到内容

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))
华夏公益教科书