допустимые символы для символов lisp


Прежде всего, как я понимаю, идентификаторы переменных называются символами в common lisp.

Я заметил, что в то время как в таких языках, как C, идентификаторы переменных могут быть только буквенно-цифровыми и подчеркивающими, Common Lisp позволяет использовать гораздо больше символов, таких как "*" и (по крайней мере, scheme) "?"

Итак, что я хочу знать: каков именно полный набор символов, которые Common Lisp позволяет иметь в символе (или идентификаторе переменной, если я ошибаюсь)? это то же самое для Схема?

Кроме того, отличается ли набор символов для имен функций?

Я гуглил, искал в CLHS, и в практическом общем Шепелявом, и в жизни моей, должно быть, что-то не так, потому что я, кажется, не могу найти ответ.

3 4

3 ответа:

Подробный ответ - это немного сложно. Существует стандарт ANSI для общего Лиспа. Он определяет набор доступных символов. В принципе, вы можете использовать все эти определенные символы для символов. Смотрите такжесимволы как токены .

Например

|Polynom 2 * x ** 3 - 5 * x ** 2 + 10|

Является допустимым символом. Обратите внимание, что вертикальные полосы обозначают символ и не относятся к имени символа.

Затем существуют существующие реализации Common Lisp и их поддержка различных наборов символов и типы строк. Поэтому некоторые поддерживают Unicode (или аналогичные) и позволяют использовать символы Unicode в именах символов.

LispWorks:

CL-USER 1 > (list 'δ 'ψ 'σ)
(δ ψ σ)

[с точки зрения интригана. Хотя некоторые понятия в Scheme и Common Lisp имеют одно и то же название, это не означает, что они означают одно и то же в обоих языках.]

Во-первых, обратите внимание, что символы и идентификаторы-это две разные вещи. Символы можно рассматривать как строки, которые поддерживают быстрое сравнение равенства. Два символа s и t равны (более или менее), если они написаны одинаково. Операция string=? должна выполнить цикл над символами В и посмотрите, все ли они одинаковы. Это займет время, пропорциональное длине самой короткой строки. Символы, с другой стороны, автоматически (в системе времени выполнения) помещаются в (обычно) хэш-таблицу. Поэтому symbol=? сводится к простому сравнению указателей и, таким образом, очень быстро. Символы часто используются в тех случаях, когда в языке Си используются перечисления. Символы - это значения, которые могут присутствовать во время выполнения. Идентификаторы-это просто имена переменных в программе.

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

И последнее, но не менее важное. Каковы юридические признаки идентифицирующего лица? Здесь лучше всего процитировать главу и версию из R6RS:

4.2.4 идентификаторы

Большинство идентификаторов, разрешенных другими языками программирования, также приемлемы для схемы. В общем случае последовательность букв, цифр и "расширенных буквенных символов" является идентификатором, когда она начинается с символа, который не может начинаться с буквы. представление числового объекта. Кроме того,+, -, и... являются идентификаторами, как и последовательность букв, цифр и расширенных буквенных символов, которая начинается с двухсимвольной последовательности ->. Вот некоторые примеры идентификаторов:

lambda         q                soup
list->vector   +                V17a
<=             a34kTMNs         ->-
the-word-recursion-has-many-meanings
Расширенные буквенные символы могут использоваться в идентификаторах, как если бы они были буквами. Ниже приведены расширенные алфавитные символы:
! $ % & * + - . / : < = > ? @ ^ _ ~ 

Кроме того, все символы, чьи скалярные значения Unicode больше 127 и чьи Категория Unicode-Lu, Ll, Lt, Lm, Lo, Mn, Mc, Me, Nd, Nl, No, Pd, Pc, Po, Sc, Sm, Sk, So или Co может использоваться в идентификаторах. Кроме того, любой символ может быть использован в идентификаторе, если он указан через an . Например, идентификатор ч\х65;ния является таким же, как идентификатор привет, и \идентификатор x3BB; такой же, как идентификатор λ.

Любой идентификатор может быть использован в качестве переменной или в качестве синтаксического ключевого слова(см. разделы 5.2 и 9.2) в программе Схемы. Любой идентификатор также может быть используется как синтаксическое данное, в этом случае оно представляет собой символ(см. раздел 11.10).

Откуда: http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-7.html#node_sec_4.2.4

Смотрите Главу 2 CLHS, в которой подробно описывается алгоритм считывания. Но простой ответ заключается в том, что если токен не является вызовом readmacro (раздел 2.4) и не является числом или всеми точками, он по умолчанию интерпретируется как символ.