2014-02-06 3 views
1

У меня есть следующая функция myFunc, тело которой является просто инструкцией eval. Может ли кто-нибудь сказать мне, почему eval НЕ видит a?какая среда выполняет `eval`? (схема)

Или более широкий вопрос будет, , где делать аргументы eval?

(define myFunc 
    (lambda (a) 
    (eval 'a))) 

(myFunc 1)  ; <<<< this causes undefined var error, WHY? 

; define a var named a in the global 
(define a 2) 

(myFunc 2)  ; <<<<< this returns 2, WHY? 

ответ

4

Вы не должны использовать eval до тех пор, пока несколько лет в вашей схеме карьеры. Под этим я подразумеваю, что многие новички неправильно верят, что требуется eval, но это вообще не так.

Для вашего примера eval принимает необязательный второй аргумент, который является environment. Если вы не указали второй аргумент, то по умолчанию будет (interaction-environment). Итак, ваш определяет локальную переменную a (аргумент lambda) и возвращает значение для a в среде взаимодействия.

В первый раз, когда вы вызываете (myFunc 1), в среде взаимодействия нет a. Затем добавьте a, связанный с 2, поэтому в следующий раз вы призываете (myFunc <anynumber>) вы получаете a в среде взаимодействия, которая 2

Ваше определение myFunc не идиоматическое. Если вы действительно хотите функцию, которая возвращает значение определенной переменной, используйте:

(define myFunc 
    (lambda (ignore) 
    a)) 

> (define a 2) 
> (myFunc 1234567) 
2 
> (set! a 10) 
> (myFunc -9876) 
10 
+0

Ну, я не использую 'eval' *, потому что мне нужно *. Я на самом деле просто пытаюсь получить вдохновение от своего поведения, поскольку я разрабатываю аналогичную функцию (для некоторого другого языка). Итак, вернемся к вопросу, справедливо ли сказать, что привязка варов внутри 'eval' динамична? –

Смежные вопросы