Являются ли квадратные скобки и фигурные скобки в Clojure все еще S-выражениями?

12

Я пытаюсь изучить Lisp и смотрю на все Lisp и их различия.

Я вижу, что в некоторых реализациях Scheme вы можете использовать квадратные скобки взаимозаменяемо с круглыми скобками для удобства чтения, поэтому, поскольку они обрабатываются одинаково, я предполагаю, что они по-прежнему являются просто S-выражениями, как и все остальное.

Однако в Clojure я вижу, что квадратные скобки и фигурные скобки используются для представления различных типов данных, таких как векторы и так далее. Являются ли они также действительными S-выражениями или их следует считать атомами? Разве это не «нарушает» всю концепцию S-выражений, что делает Clojure «нечистым» Лиспом?

mydoghasworms
источник
Технически "если квадратные скобки являются s-выражениями, как вы можете вместо этого выразить их в скобках?" не было частью вопроса, но это то, что я хочу знать.
Qwertie

Ответы:

10

Буквенные обозначения для векторов и карт (т. Е. Квадратные скобки и фигурные скобки) являются просто сахаром времени чтения , и все, что вы можете представить в этой записи, также может быть представлено с помощью S-выражений. В результате не происходит потери мощности или гомойконичности, и действительно, макросы считывателя (которые, как я понимаю, являются еще более мощными) доступны в нескольких списках.

Кстати, обратите внимание, что Clojure теперь предоставляет механизм для создания пользовательских «теговых» литералов, которые, как и другие литералы, преобразуются в S-выражения перед их компиляцией и интерпретацией.

tvachon
источник
1
Ммм, твой ответ заставляет меня думать, что я понимаю меньше, чем я думал о Лиспе. Итак, вы говорите (я думаю), что квадратные и фигурные скобки на самом деле не являются S-выражениями. Я думал, что вся идея ввода Lisp заключается в том, что все является S-выражением. Похоже, мне нужно еще покопаться, прежде чем вернуться, чтобы снова прочитать твой ответ. Благодаря!
mydoghasworms
Это правильно - они не S-выражения. Синтаксис Lisp начинается с S-выражений, так как все, что может быть выражено на языке, может быть выражено с помощью S-выражений. Но синтаксис Lisp на этом не заканчивается: многие компиляторы Lisp имеют явную фазу чтения-макроса, в которой специальные шаблоны в исходном коде преобразуются в S-выражения. Это позволяет авторам языка предлагать программистам удобный для человека синтаксис. Важно отметить, что поскольку все, что представлено этими специальными литералами, также может быть представлено в S-выражениях, ни одно из преимуществ гомоиконичности не теряется.
Твачон
3

S-выражения - это текстовое представление данных. Числа, символы, cons-ячейки, списки, строки, ... Common Lisp также имеет текстовые представления для массивов, векторов, других типов чисел, символов, ... Common Lisp также предоставляет расширяемый пользователем читатель, так что пользователь может добавлять более текстовые представления для типов данных. Иногда этот механизм также используется для изменения синтаксиса языка программирования Lisp (например, для поддержки выражений инфикса или операторов из других языков программирования).

Таким образом, если диалект Лисп предлагает текстовые представления для дополнительных типов данных, это хорошо согласуется с идеей s-выражений.

Райнер Йосвиг
источник