допустимые символы для символов lisp
Прежде всего, как я понимаю, идентификаторы переменных называются символами в common lisp.
Я заметил, что в то время как в таких языках, как C, идентификаторы переменных могут быть только буквенно-цифровыми и подчеркивающими, Common Lisp позволяет использовать гораздо больше символов, таких как "*" и (по крайней мере, scheme) "?"
Итак, что я хочу знать: каков именно полный набор символов, которые Common Lisp позволяет иметь в символе (или идентификаторе переменной, если я ошибаюсь)? это то же самое для Схема?
Кроме того, отличается ли набор символов для имен функций?
Я гуглил, искал в CLHS, и в практическом общем Шепелявом, и в жизни моей, должно быть, что-то не так, потому что я, кажется, не могу найти ответ.
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