Есть ли в 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))))