Есть ли в Racket какая-нибудь функция типа try?

Теперь я склоняюсь к интригану, просматривая книгу "Опытный интриган". Я написал код ракеткой, однако, когда я использовал tryу планировщика не было этого метода или макроса. И он сообщил, что раскрыть: несвязанный идентификатор в модуле в: попробовать. Код как показано ниже: (на странице 89)

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

Я искал документы по рэкету, но не нашел странной функции.

Так кто же знает, есть ли такая функция, как "попробовать"?

2 ответа

Решение

Вы не упоминаете об этом, но я предполагаю, что книга, о которой вы говорите, - "Закаленный интриган". Используйте следующие определения макросов для реализации 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))

Я только что нашел кого-то, кто уже написал все фрагменты кода из книги The Seasoned Schemer в github.

И это его ответ: (Это не гигиенично и не требует другой модели)

(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

Другие вопросы по тегам