gpt4 book ai didi

macros - `amb` 运算符是宏还是过程?

转载 作者:行者123 更新时间:2023-12-04 18:51:22 25 4
gpt4 key购买 nike

this页面在帖子后面有一条评论,给出了 amb 的一个非常简短的实现。作为一个程序:

(define (amb-backtrack)
(error "no solution found"))

(define (amb . args)
(call/cc (lambda (return)
(let ((backtrack amb-backtrack))
(map (lambda (x)
(call/cc (lambda (k)
(set! amb-backtrack k)
(return x))))
args)
(backtrack 'fail)))))

但是我经常看到 amb作为宏实现 - 在 schemers.org 常见问题解答以及 Dorai Sitaram's book 中:
(define amb-fail '*)

(define initialize-amb-fail
(lambda ()
(set! amb-fail
(lambda ()
(error "amb tree exhausted")))))

(initialize-amb-fail)

(define-macro amb
(lambda alts...
`(let ((+prev-amb-fail amb-fail))
(call/cc
(lambda (+sk)

,@(map (lambda (alt)
`(call/cc
(lambda (+fk)
(set! amb-fail
(lambda ()
(set! amb-fail +prev-amb-fail)
(+fk 'fail)))
(+sk ,alt))))
alts...)

(+prev-amb-fail))))))

所以 - 宏版本更长,更难理解。我看不出它比程序版本有什么优势,当然我宁愿使用程序而不是宏。有什么我错过的吗?

最佳答案

不同之处在于过程调用始终评估所有参数。

(amb 1 (very-expensive-computation))

会,程序版本为 amb ,执行 very-expensive-computation ,然后产生 1 .如果屈服 1足以进行所有进一步的计算,那么您已经在从未使用过结果值的计算上浪费了大量时间。更糟糕的事情发生了,正如@Eli Barzilay 在评论中提到的,当 amb用于模拟无限不确定性,例如生成所有自然数。

宏版本避免了这种情况,因此它的行为更接近于非确定性编程语言(如 Prolog)的行为。

关于macros - `amb` 运算符是宏还是过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5771199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com