Вы не можете -- Scheme передает все значения "по значению", поэтому в приведенном выше примере функция experiment
просто изменяет свой собственный входной аргумент. Чтобы что-то подобное работало, вы можете использовать поле, которое является явно изменяемым контейнером значений:
(define test (box "fails"))
(define (experiment input) (set-box! input "works"))
(unbox test)
(experiment test)
(unbox test)
Если вы действительно хотите изменить значение переменной, вы можете использовать макрос:
(define-syntax-rule (experiment input) (set! input "works"))
Это создает experiment
как макрос, что означает, что каждая форма (experiment foo)
переписывается в (set! foo "works")
. Это может иметь тонкие последствия, поэтому не рекомендуется использовать это, если вы не знаете, что делаете. (Например, (experiment 2)
потерпит "интересный" сбой.) Написание макросов в Scheme легко, но написать хорошие макросы по-прежнему сложнее, чем написать новое определение функции.
[Обратите внимание, что я предполагаю, что в этом ответе вы используете схему PLT. Но обе части могут быть переведены в «стандартную» схему, если это необходимо — например, используйте изменяемую ячейку cons
для первой и используйте define-syntax
с syntax-rules
для второй.]
person
Eli Barzilay
schedule
10.11.2009