2015-12-31 9 views
1

Базовый элемент cons-cell объединяет две произвольные вещи и является базовым модулем, который позволяет создавать связанные списки и произвольные объекты данных. Вопрос: есть ли причина придерживаться этого упрощенного описания дизайна языка (например, во всех семействах lisp)?
Почему бы не использовать для этой цели массивы с фиксированной длиной (или некоторые вложенные стеки)? Я не могу предвидеть никаких проблем с этим, но есть явные преимущества более «упакованной» памяти, меньшего разрешения указателя и менее «мертвого веса» cons-cells для определения иерархии данных.Функциональное программирование: почему пара как базовый блок?

+6

Большинство Lisps будет иметь множество структур данных, не состоящих из cons-элементов: числа, символы, строки, векторы, многомерные массивы, структуры/записи, классы/экземпляры, хеш-таблицы, ... –

+0

Я не думаю, корд! было бы легко реализовать с помощью вложенных стеков или фиксированных массивов. Вы также можете создавать довольно сложные структуры, чем связанные списки. (Двоичные деревья, список случайного доступа, очереди и требования), а реализация таких ячеек на C проста. Представление самого кода в такой структуре (вложенных списках) внутренне также облегчает реализацию макросистемы. Вы можете делать странные вещи за кулисами и все еще быть lispy, как clojure, но главная причина, что это сделано, есть ограничения в Java VM. – WorBlux

+0

более важно, более быстрый доступ, O (1) или около того. Clojure делает это. –

ответ

3

Вы назвали свой вопрос «Функциональное программирование: почему пара как базовый построенный блок?», Но этот заголовок не отражает правильно тот факт, что многие важные и хорошо известные функциональные языки (например, Haskell, F #, Scala, SML, Clojure и т. Д.) Имеют либо алгебраические типы данных, либо различный набор структур данных, в которых пара является всего лишь одним из разных типов конструкторов, даже если они доступны. Ситуация аналогична для других языков многопараметрических языков, которые поддерживают функциональное программирование, такое как C++, Java, Objective-C, Swift и т. Д.

Во всех этих случаях пара, если присутствует, является в точности «базовой» как массив, запись или список или любой другой тип конструктора данных.

Осталось семейство языков Лиспа, в частности Common Lisp и Scheme, которые наряду с богатым набором структур данных, например, цитируемыми в комментарии Райнера Йосвига, используют пару для важной задачи: поскольку базовый конструктор данных для представления программ.

Тот факт, что код Lisp является s-выражением (то есть списком списков и атомов), имеет основополагающие последствия, наиболее заметным из которых является рост макросистем, которые позволяют программистам создавать легко новый синтаксис или даже новых доменных языков.

2

Renzo's answer О других структурах функционального программирования находится на месте. Функциональное программирование - это согласование программирования с логикой и математикой, где выражения обозначают значения, и нет такого эффекта, как побочный эффект. (Конечно, на практике нам нужны побочные эффекты для ввода-вывода и т. Д.). Функциональное программирование не требует односвязного списка в качестве фундаментальной конструкции.

Списки являются Одна из вещей, которые делают Lisps лишены. Одна из причин, по которой пары настолько распространены в семействе языков Lisp, может заключаться в том, что упорядоченные пары очень легко реализовать в исчислении лямбда, которые вдохновляют Lisps. (Я говорю «вдохновленный», а не «основанный на», потому что после синтаксиса и использования лямбда для обозначения анонимных функций существует большая разница, и лучше не предполагать, что что-то об одном относится к другому.) См. Ответ до Use of lambda for cons/car/cdr definition in SICP для быстрого урока о том, как можно использовать cons, car и cdr, используя только лексические замыкания.