Как бы вы использовали набор! в простой процедуре f такой, что оценка (+ (f 0) (f 1)) вернет 0, если аргументы для + оцениваются слева направо, но вернет 1, если аргументы оцениваются справа налево?
Как пользоваться набором! в функциях схемы?
Ответы (2)
Самый простой подход, вероятно, состоит в том, чтобы сохранить какое-то внешнее состояние и реализовать влияние f на его содержимое.
(define x 0)
(define (f n) (let ((tmp x)) (set! x n) tmp))
Таким образом, x изначально равен 0, и каждый вызов f будет возвращать текущее значение x и сохранять аргумент как новое значение x. Таким образом, (f 0), за которым следует (f 1), оба вернут 0, оставив конечное значение x равным 1. При вычислении (f 1), за которым следует (f 0), будет получено 0, затем 1, с конечным значением x, равным 0.
person
Andrew Beyer
schedule
19.11.2008
С помощью call/cc.
(define (f)
(call/cc
(lambda (c) (+ (c 0) (c 1)))))
(write (f))
Вызов c в любом из аргументов + приводит к немедленному возврату f, что дает 0 или 1 в зависимости от того, какой аргумент оценивается первым.
Но я подозреваю, что он всегда будет оценивать слева направо и, таким образом, возвращать 0.
person
finnw
schedule
22.04.2009