在Racket中有没有像'try'这样的功能

时间:2012-08-03 02:42:58

标签: scheme racket seasoned-schemer

现在,我正在通过查看 The Seasoned Schemer 这本书来吸引阴谋家。 我通过racket编写代码,但是当我使用try时,策划者没有这个方法或宏。它报告扩展:模块中的未绑定标识符:try。 代码如下:(在第89页)

(define (remove-member-first* a lat)
   (try oh (rm a lat oh) lat))

我搜索了球拍文件,但没有找到熟悉的功能。

那么谁知道是否有类似“尝试”的功能?

2 个答案:

答案 0 :(得分:13)

我刚发现有人已经在github的书中写了 The Seasoned Schemer 中的所有代码片段。

这是他的回答:(这不是非卫生的,不需要其他模型)

(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))))

链接为https://github.com/viswanathgs/The-Seasoned-Schemer

答案 1 :(得分:4)

你没有提到它,但我猜你所说的那本书是“The Seasoned Schemer”。使用以下宏定义来实现本书中定义的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))