Guile 中的追踪 - 如何在 Guile 方案中追踪

Vol*_*yuk 6 scheme trace guile

(trace procedure)Guile 方案中的和Chez 方案中的追踪设施的等效项是什么(trace-let (bindings) body)

我已经查看了https://www.gnu.org/software/guile/manual/html_node/Tracing-Traps.html上的文档,但我无法弄清楚如何从源代码文件中使用 Guile 跟踪过程,而不是来自 Guile REPL,这可以使用,trace (procedure application)给定的先前导入的模块来完成(use-modules (system vm trace))

我有兴趣从源代码跟踪递归过程的应用程序,类似于(trace fact1)下面的控制台输出

trace: (fact1 4)
trace: |  (fact1 3)
trace: |  |  (fact1 2)
trace: |  |  |  (fact1 1)
trace: |  |  |  |  (fact1 0)
trace: |  |  |  |  1
trace: |  |  |  1
trace: |  |  2
trace: |  6
trace: 24
Run Code Online (Sandbox Code Playgroud)

(let name (bindings) body)可以在 Guile 中追踪命名的 let语法扩展吗?当研究过程的尾递归实现时,就会出现这种需要。

非常感谢!

小智 3

请参阅在过程调用中添加陷阱!在页面上https://www.gnu.org/software/guile/docs/docs-2.0/guile-ref/High_002dLevel-Traps.html

一个例子:

(define (factorial n)
  (fact-iter 1 1 n))
(define (fact-iter product counter max-count)
  (if (> counter max-count)
      product
      (fact-iter (* counter product)
 (+ 1 counter)
 max-count)))
(add-trace-at-procedure-call! fact-iter)
(add-trace-at-procedure-call! factorial)
(factorial 6)
$41 = 7
$42 = 8
Trap 8: (factorial 6)
Trap 7: (fact-iter 1 1 6)
Trap 7: |  (fact-iter 1 2 6)
Trap 7: |  |  (fact-iter 2 3 6)
Trap 7: |  |  |  (fact-iter 6 4 6)
Trap 7: |  |  |  |  (fact-iter 24 5 6)
Trap 7: |  |  |  |  |  (fact-iter 120 6 6)
Trap 7: |  |  |  |  |  |  (fact-iter 720 7 6)
Trap 7: |  |  |  |  |  |  720
Trap 7: |  |  |  |  |  720
Trap 7: |  |  |  |  720
Trap 7: |  |  |  720
Trap 7: |  |  720
Trap 7: |  720
Trap 7: 720
Trap 8: 720
$43 = 720
Run Code Online (Sandbox Code Playgroud)

阶乘和事实迭代取自 SICP 1.2.1。

我不知道如何让它显示尾递归,或者这是否意味着没有尾递归调用优化。但它有痕迹。