Как использовать набор! в схеме функции? - PullRequest
5 голосов
/ 19 ноября 2008

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

Ответы [ 2 ]

6 голосов
/ 19 ноября 2008

Самый простой подход, вероятно, состоит в том, чтобы сохранить некоторое внешнее состояние и сделать так, чтобы реализация 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.

0 голосов
/ 22 апреля 2009

С вызов / куб. См. .

(define (f)
  (call/cc
    (lambda (c) (+ (c 0) (c 1)))))

(write (f))

Вызов c внутри любого аргумента для + заставляет <em>f</em> немедленно возвращаться, приводя к 0 или 1 в зависимости от того, какой аргумент вычисляется первым.

Но я подозреваю, что он всегда будет оцениваться слева направо и, следовательно, вернет 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...