2009-11-21 3 views

ответ

8

Я не уверен на 100%, но будет:

((eval '+) 1 2) 

работа? Я не уверен, нужно ли указывать среду, или даже если это работает - я схема noob. :)

+0

Так просто, не знаю, как я пропустил это. Спасибо! :) –

+1

Нет проблем! (15 символов) –

+1

Если вы хотите, чтобы он работал с _any_ окружением, вы, вероятно, должны использовать '(eval '+ (null-environment 5))' –

0

Новичок тоже так надеюсь, я понял ваш вопрос правильно ...

Функция объекты первого класса в схеме, так что вам не нужно Eval:

1 ]=> (define plus +) 

;Value: plus 

1 ]=> (plus 2 3) 

;Value: 5 

HTH

Обновление: проигнорировать это и увидеть комментарии!

+0

@Ben - вы пропустили часть, в которой цитируется '+', следовательно, это не является непосредственно процедурой, пока она не будет оценена. –

+0

ах да, см. Это сейчас. Спасибо Ювалю. – Ben

3

Ответы Лукаса велики. Для ненадежного ввода вы можете сделать белый список разрешенных символов/операторов.

(define do-something (lambda (op) 
         (cond 
         ((equal? op `+) +) 
         ((equal? op `-) -) 
         ((equal? op `*) *) 
         ((equal? op `/) /) 
         ((equal? op `^) ^)))) 

((do-something `+) 1 2)