Rebol 编程/调试技术
Rebol 中有各种调试工具可用。
探测 是一种非常有用的工具。它的作用是读取函数的返回值并在控制台上输出它们。返回值通过 探测 传递,因此您可以在程序中的任何地方插入它。
>> wallet: $25 == $25.00 >> probe wallet $25.00 == $25.00
该值既被打印又作为值返回,因为 探测 允许返回值通过自身传递,而 打印 则不返回有用的值。
一个更有用的例子
>> add 3 probe add 2 2 4 == 7
注意: 小心探测大型对象,因为它们可能需要很长时间才能在控制台上打印。大量的输出可以通过按 Escape 键停止。
跟踪 可以帮助您在控制台上查看函数调用或 TCP/IP 网络统计信息。
>> trace/func on
跟踪/函数 返回大量反馈,因此最好只在需要检查的代码周围激活它。
trace/func on ... some problematic code ... trace/func off
>> trace/net on
在 Rebol 中,很容易意外地重新定义系统词,因为所有 词都可以重新定义。此代码会导致奇怪的事情发生,远离原始错误
gt: func [a b] [ return: a < b ]
返回上的那个多余的 ":" 重新定义了返回,而不是返回预期的结果。任何后来使用返回的代码都可能出现故障。
一个解决方案可能是保护所有现有的词免受更改
>> protect-system
添加 打印 语句是调试代码的一种传统方法。Rebol 有一种巧妙的方法可以让你在不需要时让这些语句保持未激活状态
诀窍是将另一个词定义为 print 的同义词,例如
>> dprint: :print
并使用它来添加调试打印语句
>> dprint ["my count is " my-count] >> dprint ["file info:" mold info? my-text-file.txt]
在生产代码中,或者当您想关闭调试语句时,只需添加
>> dprint: func [data] []
Rebol 提供了特定的函数来帮助调试。函数 ?? 打印一个变量名,后跟它的模塑值。与 打印 函数不同,它还返回它接收的值。
>> test: "Hello" == "Hello" >> value: ?? test test: "Hello" == "Hello" >> ?? value value: "Hello" == "Hello"
调试完成后,您可以从源代码中删除所有 ??,或者重新定义 ??,使其只传递值,就好像它不再存在一样。
??: func [val] [val]
当 VID 程序正在运行时,您无法使用控制台来键入 打印 或 ?? 或任何其他调试函数。解决此问题的一种方法是在您的 VID 程序中添加一个控制台输入字段,并执行键入到该字段中的内容
view layout [ button "Add" [field1/text: 1 + to-integer field1/text show field1] label "number" field1: field 100 "1" label "console:" console: field 100 [attempt [do console/text]] ]
尝试在标有控制台 的字段中键入 help view。
您可以通过在您的程序中添加一个简单的按钮来节省少许调试时间,该按钮退出程序并重新启动它。
unview/all do %<programname>
使用 Escape 键可以将程序停止到控制台。
可以使用 do-events 命令继续 GUI 程序。