Преобразование строки в процедуру - PullRequest
2 голосов
/ 24 августа 2011

Я создаю программу, которая позволяет пользователю вводить лямбда-функцию, только записывая ее в поле ввода интерфейса, следующим образом:

(lambda (p q) (and (not p) q))

Это результат "(лямбда (pq) (и (не p) q)) "потому что схема преобразует ее в строку вместо процедуры, которая может быть оценена.

Как я могу преобразовать эту строку в процедуру?

1 Ответ

4 голосов
/ 27 августа 2011

В Схеме функция 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...