В Схеме функция eval
работает только со списками символов, поэтому это будет работать нормально:
(eval '(+ 1 2))
Но это приведет к ошибке:
(eval "(+ 1 2)")
Toпреобразовать строку из пользовательского интерфейса в список символов (AKA-S-выражение), вам нужно вызвать функцию read
.Как правило, read
работает только с «портами» (потоком файлов), поэтому вам нужно преобразовать строку в порт ввода, прежде чем ее можно будет использовать с read
:
(define (read-string text)
(read
(open-input-string text)))
Все, что осталось, эточтобы вычислить строку и вызвать лямбду, которую вы получите в результате:
(define (call-string text-lambda . args)
(apply
(eval (read-string text-lambda))
args))
Вот как теперь вы можете вычислить число 3:
(call-string "(lambda (a b) (+ a b))" 1 2)
Вы найдете API для read
и open-input-string
на веб-сайтах R5RS и SRFI .