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-05-31 23:29:16 发布