2012-04-02 3 views
2

Я пытаюсь создать структуру данных, подобную массиву, в Scheme, и поскольку мне нужно часто ссылаться на нее (и изменять ее!), Я хочу дать ей имя. Но из того, что я читал на разных сайтах, похоже, единственный способ назвать список для последующей ссылки - define. Это было бы хорошо, за исключением того, что он также выглядит как только я инициализирую список с помощью define, он становится более сложным, изменяя или добавляя в указанный список. Например, кажется, что я не смогу сделать только (append wordlist (element)), мне нужно что-то в этом роде! бах.Назовите список в схеме

В основном мои вопросы сводятся к: define моей единственной надеждой назвать список? И если так, я застрял, прыгая через обручи, меняя свои элементы? Благодарю.

ответ

0

(append wordlist (element)) создает новый список. Вы можете захотеть использовать set! для перенаправления ссылки на новый список или define ссылку на новый список с использованием имени того же символа.

2

Да, define is Способ для обозначения вещей на схеме. Обычный список в Scheme не позволит вам изменять его элементы, потому что он неизменен - ​​это одна из вещей, с которыми вам придется научиться жить при работе с функциональной структурой данных. Конечно, вы можете добавлять к нему элементы или удалять элементы, но эти операции будут производить новых списков, вы не можете изменять элементы на месте.

Другим вариантом является использование измененных списков вместо обычных списков, но если вы просто учитесь использовать Схему, лучше сначала придерживаться неизменяемых списков и изучить способ схемы делать вещи с точки зрения неизменяемых данных ,

+0

AFAIK, списки схемы не являются неизменными. Есть некоторые императивные команды для изменения их элементов. – Vincent

+0

Хорошо, спасибо за помощь. Я думаю, что я могу сделать вещи более легко, если я добавлю новые элементы на фронт, а не обратно ... – AmberWolfe

+0

@AmberWolfe это правильно! фронт односвязного списка - это самое простое место для добавления элементов и наиболее эффективное. Используйте 'cons' для добавления на передний план и не забывайте, что он создает новый список, он не изменяет исходный список, и вам нужно будет его снова сохранить –

1

Да, определение - это способ выполнить «присвоение» (на самом деле именование) в Схеме. Хотя, если вы пишете какой-то пакет, вы можете рассмотреть возможность обертывания всего объекта внутри функции, а затем использовать let, чтобы определить то, о чем вы говорите.

Тогда, конечно, у вас должна быть какая-то абстракция, чтобы развернуть функции внутри вашего «пакета».

См SICP 2.5 Строительные Системы с Generic операций

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-18.html#%_sec_2.5

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