Как пользоваться набором! в функциях схемы?

Как бы вы использовали набор! в простой процедуре f такой, что оценка (+ (f 0) (f 1)) вернет 0, если аргументы для + оцениваются слева направо, но вернет 1, если аргументы оцениваются справа налево?


person Community    schedule 19.11.2008    source источник


Ответы (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