Что такое действительные идентификаторы в 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? не удастся это будет символом.

Другие вопросы по тегам