How the amb run?
(define-syntax amb
(syntax-rules ()
((amb alt ...)
(let ((prev-amb-fail amb-fail))
(call/cc
(lambda (sk)
(call/cc
(lambda (fk)
(set! amb-fail
(lambda ()
(set! amb-fail prev-amb-fail)
(fk 'fail)))
(sk alt))) ...
(prev-amb-fail)))))))
For example.
(amb #f #t)
It will be expaned as follow.
(let ((prev-amb-fail amb-fail))
(call/cc
(lambda (sk)
; branch 1
(call/cc
(lambda (fk)
(set! amb-fail
(lambda ()
(set! amb-fail prev-amb-fail)
(fk 'fail)))
(sk #f)))
; branch 2
(call/cc
(lambda (fk)
(set! amb-fail
(lambda ()
(set! amb-fail prev-amb-fail)
(fk 'fail)))
(sk #t)))
(prev-amb-fail))))
The (amb) will be expanded as follow.
(let ((prev-amb-fail amb-fail))
(call/cc
(lambda (sk)
(prev-amb-fail))))
The (prev-amb-fail) is invoked.
If failed, return the #f branch, and then the #t branch is began to run. The #t is selected to return.
June 24th Wednesday (六月 二十四日 水曜日)
最新推荐文章于 2025-08-21 09:06:15 发布
本文详细解析了AMB宏的工作原理及实现方式,并通过具体示例展示了其如何在程序中进行回溯选择。AMB宏能够帮助程序实现非确定性选择,在遇到失败情况时返回并尝试其他可能的选择。
1329

被折叠的 条评论
为什么被折叠?



