Scheme 有没有像';试试';吵闹
现在我通过看《老练的阴谋家》一书来学习阴谋家。 我用racket编写代码,但是当我使用Scheme 有没有像';试试';吵闹,scheme,racket,seasoned-schemer,Scheme,Racket,Seasoned Schemer,现在我通过看《老练的阴谋家》一书来学习阴谋家。 我用racket编写代码,但是当我使用try时,schemer没有这个方法或宏。它在模块中报告了expand:unbound标识符in:try。 代码如下:(在第89页) 我搜索了racket文档,但没有找到smiliar函数 那么,谁知道有没有像“尝试”这样的功能呢?你没提到,但我猜你说的那本书是《老练的阴谋家》。使用以下宏定义来实现本书中定义的try: (require mzlib/defmacro) (define-macro (letcc
try
时,schemer没有这个方法或宏。它在模块中报告了expand:unbound标识符in:try。
代码如下:(在第89页)
我搜索了racket文档,但没有找到smiliar函数
那么,谁知道有没有像“尝试”这样的功能呢?你没提到,但我猜你说的那本书是《老练的阴谋家》。使用以下宏定义来实现本书中定义的
try
:
(require mzlib/defmacro)
(define-macro (letcc c . body)
`(call/cc (lambda (,c) ,@body)))
(define-macro (try x a b)
`(letcc *success*
(letcc ,x
(*success* ,a))
,b))
我刚刚发现有人已经在github中编写了《老练的Schemer》一书中的所有代码片段 这是他的答案:(这不是不卫生的,不需要其他型号)
链接是是的,它起作用了。谢谢我需要添加“(require mzlib/defmacro)”。我在回答中添加了这一点,因为澄清卫生宏始终是个坏主意,尤其是对于这样一个简单的宏,您可以使用
定义语法规则。耶!当然是我喜欢的答案。注意,racket中已经有了一个letcc,但它被称为let/cc
,而且,你应该可以不用使用let/ec
,也可以使用define syntax rule
,你可以将try定义为:(define syntax rule(try var a b…)(let/ec success(let/ec var(success a))b…)
cf。
(require mzlib/defmacro)
(define-macro (letcc c . body)
`(call/cc (lambda (,c) ,@body)))
(define-macro (try x a b)
`(letcc *success*
(letcc ,x
(*success* ,a))
,b))
(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))))