Получаем эффекты "set!" без его использования - PullRequest
1 голос
/ 21 марта 2011

У меня определены railroad1 и station1, и я хочу обновить значение railroad1 без использования set!или другое определение.Например:

(define railroad1 (list 1991))
(define station1 (list "station"))

(define (add-station railroad station)
  (append railroad station)
)

Когда я звоню (add-station railroad1 station1), я получаю

(1991 "station")

Теперь я могу сделать это:

(define railroad1 (add-station railroad1 station1))

Так чтоrailroad1 теперь (1991 "station") вместо просто (1991).

Однако моя конечная цель - просто позвонить

(add-station railroad1 station1)

и переопределить railroad1 как (1991 "station") без явного переопределения railroad1, как указано выше, и без использования set!либо.

РЕДАКТИРОВАТЬ: set-car !, set-cdr !, и другие подобные специальные формы также не допускаются.

Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 01 мая 2011

Что если вы использовали оператор let? Таким образом, вы устанавливаете начальные значения railroad1 и station1 в let, а затем можете обновить их, вызвав let снова. Scoping должен держать ваши переменные "в безопасности" от набора! Я бы хотел видеть больше кода, который вы написали, например, эту функцию add-station, которую вы вызываете во второй строке.

0 голосов
/ 06 июня 2011

Это должно работать:

(define-syntax add-station
  (syntax-rules ()
    ((_ railroad station) (define railroad (append railroad station)))))

РЕДАКТИРОВАТЬ

Извините, не заметил тег домашней работы.Я объясню ответ.

define-syntax производит так называемый макрос .Макросы работают не так, как обычные функции.Вместо оценки операндов они напрямую заменяют вызов макроса телом макроса._ в syntax-rules означает исходное имя макроса, то есть add-station.Поэтому, когда вы звоните

(add-station railroad1 station1)

, он напрямую заменяется на

(define railroad1 (append railroad1 station1))

, который затем выполняется.

Надеюсь, это поможет!

0 голосов
/ 21 марта 2011

Да, если вам разрешено использовать set-cdr!.

(set-cdr! railroad1 station1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...