Предположим, у меня есть простой символ:Применение символа в качестве процедуры
> '+
+
Есть ли способ, я могу применить этот символ в качестве процедуры:
> ((do-something-with '+) 1 2)
3
Так что '+
оценивается в процедура +
?
Предположим, у меня есть простой символ:Применение символа в качестве процедуры
> '+
+
Есть ли способ, я могу применить этот символ в качестве процедуры:
> ((do-something-with '+) 1 2)
3
Так что '+
оценивается в процедура +
?
Я не уверен на 100%, но будет:
((eval '+) 1 2)
работа? Я не уверен, нужно ли указывать среду, или даже если это работает - я схема noob. :)
Новичок тоже так надеюсь, я понял ваш вопрос правильно ...
Функция объекты первого класса в схеме, так что вам не нужно Eval:
1 ]=> (define plus +)
;Value: plus
1 ]=> (plus 2 3)
;Value: 5
HTH
Обновление: проигнорировать это и увидеть комментарии!
@Ben - вы пропустили часть, в которой цитируется '+', следовательно, это не является непосредственно процедурой, пока она не будет оценена. –
ах да, см. Это сейчас. Спасибо Ювалю. – Ben
Ответы Лукаса велики. Для ненадежного ввода вы можете сделать белый список разрешенных символов/операторов.
(define do-something (lambda (op)
(cond
((equal? op `+) +)
((equal? op `-) -)
((equal? op `*) *)
((equal? op `/) /)
((equal? op `^) ^))))
((do-something `+) 1 2)
Так просто, не знаю, как я пропустил это. Спасибо! :) –
Нет проблем! (15 символов) –
Если вы хотите, чтобы он работал с _any_ окружением, вы, вероятно, должны использовать '(eval '+ (null-environment 5))' –