【发布时间】:2011-08-11 21:18:43
【问题描述】:
在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))))))
所以 - 宏版本更长,并且更难理解。我看不出它比过程版本有什么优势,当然我宁愿使用过程而不是宏。有什么我错过的吗?
【问题讨论】:
标签: macros scheme non-deterministic