Felleisen 和 Friedman 在他们的《The Seasoned Schemer》一书中介绍了该try函数。根据http://community.schemewiki.org/?seasoned-schemer,这个函数可以定义为
(define-syntax try
(syntax-rules ()
((try var a . b)
(letcc success
(letcc var (success a)) . b))))
其中letcc定义为
(define-syntax letcc
(syntax-rules ()
((letcc var body ...)
(call-with-current-continuation
(lambda (var) body ... )))))
现在,虽然我了解try它的作用以及如何使用它,但我很难遵循它的正式定义。letcc点在tosuccess和(letcc var (success a)) . bline中的应用到底是什么意思
(letcc success
(letcc var (success a)) . b)
的try?或者可以换一种方式问:try建立的定义的哪一部分try被评估为bifvar被调用a?
编辑1:对不起,定义letcc不完整。添加了缺少的第一行。
编辑 2:以下代码可以在 Racket 中运行。
(define-syntax letcc
(syntax-rules ()
((letcc var body ...)
(call-with-current-continuation
(lambda (var) body ... )))))
(define-syntax try
(syntax-rules ()
((try var a . b)
(letcc success
(letcc var (success a)) . b))))
(try var (+ 1 1) 4)
; output: 2
(try var (var '(2)) 4)
; output: 4