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