Что такое действительные идентификаторы в R7RS-small?
R7RS-small говорит, что все идентификаторы должны заканчиваться разделителем, но в то же время он определяет довольно сложные правила того, что может быть в идентификаторе. Итак, что это?
Предполагается, что идентификатор начинается с начального символа, а затем продолжается до разделителя, или он начинается с начального символа и продолжается в соответствии с синтаксисом, определенным в 7.1.1.
Вот пара очевидных случаев. Это действительные идентификаторы?
a#a
b,b
c'c
d[d]
Если они не должны быть действительными, зачем говорить, что идентификатор должен заканчиваться разделителем?
1 ответ
|..ident..|
являются разделителями для символов в R7RS, чтобы разрешить любой символ, который вы не можете вставить в символ старого стиля (|
является разделителем).
Однако в R6RS "official"
грамматика была неправильной, так как не позволяла определять символы так, чтобы1+
, в результате чего все реализации определяют свои собственные правила для преодоления этой болезни официальной грамматики.
Если вам не нужно читать исходный код данной реализации и видеть, как он определяет символы, вам не следует слишком заботиться об этих правилах и использовать классические символы.
В разделе 7.1.1 вы найдете форму backus-naur, которая определяет лексическую структуру идентификаторов R7RS, но я сомневаюсь, что реализации следуют ей.
Я цитирую отсюда
Как и в случае с идентификаторами, разные реализации Scheme используют несколько разные правила, но всегда бывает так, что последовательность символов, которая не содержит специальных символов и начинается с символа, который не может начинать число, считается символом.
Другими словами, реализация будет использовать такую функцию, как read-atom, и после этого она будет классифицировать атом путем обратного отслеживания с номером чтения и ifnumber? не удастся это будет символом.