Scheme 有没有像';试试';吵闹

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

现在我通过看《老练的阴谋家》一书来学习阴谋家。 我用racket编写代码,但是当我使用
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))))