LINUX.ORG.RU

Scheme, идентификаторы

 


0

1

R5RS, 7.1.1 Lexical structure:

<identifier> --> <initial> <subsequent>* | <peculiar identifier>
<initial> --> <letter> | <special initial>
<letter> --> a | b | c | ... | z
<special initial> --> ! | $ | % | & | * | / | : | < | = | > | ? | ^ | _ | ~
<subsequent> --> <initial> | <digit> | <special subsequent>
<digit> --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<special subsequent> --> + | - | . | @
<peculiar identifier> --> + | - | ...
<syntactic keyword> --> <expression keyword>
     | else | => | define 
     | unquote | unquote-splicing
<expression keyword> --> quote | lambda | if
     | set! | begin | cond | and | or | case
     | let | let* | letrec | do | delay
     | quasiquote
Вопрос по синтаксису идентификаторов: по спецификации невозможны идентификаторы типа ++, ...., ---. Однако racket и chicken спокойно работают с такими идентификаторами. Где я туплю?

★★★★★

В guile тоже работает.

А что в этом странного? :) хотя наверное не стоит их так именовать...

guile> (define (++ x) (+ x 1))
guile> (++ 10)
11
BattleCoder ★★★★★
()
Последнее исправление: BattleCoder (всего исправлений: 1)

А спефцификации по ходу и правда противоречит.

BattleCoder ★★★★★
()

2.1 Identifiers

Most identifiers allowed by other programming languages are also acceptable to Scheme. The precise rules for forming identifiers vary among implementations of Scheme, but in all implementations a sequence of letters, digits, and «extended alphabetic characters» that begins with a character that cannot begin a number is an identifier. In addition, +, -, and ... are identifiers. Here are some examples of identifiers:

lambda q list->vector soup + V17a <=? a34kTMNs the-word-recursion-has-many-meanings

Extended alphabetic characters may be used within identifiers as if they were letters. The following are extended alphabetic characters:

! $ % & * + - . / : < = > ? @ ^ _ ~ See section 7.1.1 Lexical structure for a formal syntax of identifiers.

А тут можно. Спека противоречит сама себе?

encyrtid ★★★★★
() автор топика
Ответ на: комментарий от encyrtid

Я в процитированном примере 9 идентификаторов вижу, все вроде удовлетворяют бнф-у из первого поста. Что касается ++, ...., --- их в цитате из документации нет. Racket и прочие видимо переваривают, потому что не включен режим соответствия r5rs или они некорректно реализуют стандарт.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Я в процитированном примере 9 идентификаторов вижу, все вроде удовлетворяют бнф-у из первого поста. Что касается ++, ...., --- их в цитате из документации нет. Racket и прочие видимо переваривают, потому что не включен режим соответствия r5rs или они некорректно реализуют стандарт.

Я не об этом. Согласно п. 7.1.1. идентификаторы типа ++ недопустимы. Согласно п. 2.1 - допустимы. Проверял на racket в режиме r5rs, chicken, guile.

encyrtid ★★★★★
() автор топика
Ответ на: комментарий от encyrtid

Согласно п. 2.1 идентификаторы типа ++ допустимы

В упор не вижу, из чего это следует. Может ты невнимательно читаешь?

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В упор не вижу, из чего это следует. Может ты невнимательно читаешь?

Я об этом:

Extended alphabetic characters may be used within identifiers as if they were letters. The following are extended alphabetic characters:

! $ % & * + - . / : < = > ? @ ^ _ ~

encyrtid ★★★★★
() автор топика
Ответ на: комментарий от encyrtid

that begins with a character that cannot begin a number is an identifier

Плюс, минус, точка могут начинать число, поэтому они не могут быть первым символом идентификатора.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В упор не вижу, из чего это следует

<special initial> --> ! | $ | % | & | * | / | : | < | = | > | ? | ^ | _ | ~

ТСу: пункт 2.1 читали? Это рекомендация, не более. Во многих реализациях можно и кириллицу использовать, к примеру. Правильность отдается на откуп программисту.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от Legioner

that begins with a character that cannot begin a number is an identifier

А вот это я проглядел.

encyrtid ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.