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)) . b
line中的应用到底是什么意思
(letcc success
(letcc var (success a)) . b)
的try
?或者可以换一种方式问:try
建立的定义的哪一部分try
被评估为b
ifvar
被调用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