Scheme continuation 之 amb
- ;;; amb
- ;;; Example:
- ;;; > (if (amb #f #t)
- ;;; 1
- ;;; (amb))
- ;;; 1
- ;;; > (let ((x (list (amb 1 4 5)
- ;;; (amb 2 6 7))))
- ;;; (let ((x1 (car x))
- ;;; (x2 (cadr x)))
- ;;; (amb:assert (and (even? x1)
- ;;; (even? x2)))
- ;;; (amb:assert (< x1 x2)))
- ;;; x)
- ;;; (4 6)
- (define amb:fail #f)
- (define (amb:init-fail)
- (set! amb:fail
- (lambda () (error "amb tree exhausted"))))
- (amb:init-fail)
- (define-syntax amb
- (syntax-rules ()
- ((amb alt ...)
- (let ((amb:prev-fail amb:fail))
- (call/cc
- (lambda (choose)
- (call/cc
- (lambda (jump)
- (set! amb:fail
- (lambda()
- (set! amb:fail amb:prev-fail)
- (jump 'next)))
- (choose alt))) ...
- (amb:prev-fail)))))))
- (define (amb:assert pred)
- (when (not pred)
- (amb)))
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
本帖最后由 KanonInD 于 2011-02-05 22:01 编辑
网上还有另一个版本:
复制代码