2010-12-04 4 views
3

Я пытаюсь эмулировать стек в схеме. Я использую DrScheme, и я выбираю язык R5RS. Мне нужно создавать функции, которые появляются, толкают и заглядывают. Но мне трудно понять, как пройти по ссылке. Я прочитал некоторую информацию о коробках, но они не поддерживаются в R5RS. Есть ли другой способ пройти по ссылке?Схема R5RS: передать по ссылке

ответ

0

Вместо того, чтобы передавать «по ссылке», что вы можете сделать на императивном языке, Scheme рекомендует вам думать в функциональном смысле. Это означает, что push операция, например, будет принимать два параметра:

  • стопку
  • новый элемент

и возвращение новый стек, который содержит новый элемент в сочетании с остальная часть существующего стека. Аналогично, операция pop приведет к стеку и вернет один из них, а верхний элемент исчезнет, ​​а peek вернет значение верхнего элемента.

Как оказалось, списки в Scheme работают почти так же, как стеки. Следующие отображения помогут вам начать работу:

  • нажимные - против
  • поп - отдых
  • заглядывать - первый
+0

Мне нужно поп, чтобы сделать больше, чем просто удалить верхний элемент и вернуть список. Функция pop должна возвращать верхний элемент, а также удалять его из списка. Поэтому я не могу вернуть список, потому что мне нужно вернуть верхний элемент. – Crbreingan 2010-12-04 21:15:20

1

Короткий ответ: не используйте r5rs; просто используйте родной язык. В текущих версиях DrRacket этот язык называется «ракеткой». Вот программа, которая использует коробки:

#lang racket 

(define b (box 234)) 

(set-box! b 333) 

(unbox b) 

FWIW: ответ Грега более чисто функциональным, чем у меня, но было бы ошибкой полагать, что изменяемые структуры не доступны в DrRacket (урожденная DrScheme).

Наконец, вы неправильно используете термин «вызов по ссылке». Коробки - это просто изменчивые структуры, а язык с привязкой по значению (например, racket, r5rs, java и т. Д.) Может очень легко изменить эти структуры.

Смежные вопросы