跳转到内容

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]

在 GUI 程序中添加调试选项

[编辑 | 编辑源代码]

当 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

快速重启 GUI 程序

[编辑 | 编辑源代码]

您可以通过在您的程序中添加一个简单的按钮来节省少许调试时间,该按钮退出程序并重新启动它。

unview/all
do %<programname>

停止和继续程序

[编辑 | 编辑源代码]

使用 Escape 键可以将程序停止到控制台。

可以使用 do-events 命令继续 GUI 程序。

华夏公益教科书