понедельник, 19 ноября 2012 г.

Racket и eval-string

Это интересно. Пусть у нас есть Racket, где мы определим метод eval-string и запросим библиотеку для работы со множествами

1
2
3
4
(define ns (make-base-namespace))
(define (eval-string str)
 (eval (call-with-input-string str read) ns))
(eval-string "(require racket/set)")

По-eval'им немного, а дальше столкнемся со странным

1
2
> (set? (eval-string "(set 1 2)"))
#f

Надо заметить, что

1
2
> (list? (eval-string "(list 1 2)"))
#t

Это конечно связано с тем, что list (в отличие от set) входит в racket/base; make-base-namespace как бы намекает нам.
Документация подсказывает правильное решение

1
2
3
4
(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(define (eval-string str)
 (eval (call-with-input-string str read) ns))

И все же, какой тип имеет (eval-string "(set 1 2)")?

Комментариев нет:

Отправить комментарий