Курс по Raku / Приложение 🆕 / Типове и текстови машини / Регулярни изрази и граматики / Exercises / Проверете идентификатори

Решение: Проверете идентификатори

Ето едно възможно решение на задачата.

Код

for <count total2 2fast my-var _hidden> -> $name {
    my $ok = $name ~~ / ^ <[A..Za..z_]> <[A..Za..z0..9_]>* $ /;

    say "$name: { $ok ?? 'valid' !! 'invalid' }";
}

🦋 Намерете програмата във файла validate-identifier.raku.

Изход

count: valid
total2: valid
2fast: invalid
my-var: invalid
_hidden: valid

Коментари

  1. Котвите ^ и $ принуждават шаблона да покрие целия низ, така че един-единствен излишен знак като тирето в my-var го прави невалиден.

  2. Първият клас от знаци допуска буква или долна черта; вторият, повторен с *, допуска допълнително и цифри — точно по класическото правило за идентификатор.

  3. Вторият клас може да се запише и като \w — вграденото скъсяване за словесен знак (буква, цифра или долна черта):

    my $ok = $name ~~ / ^ <[A..Za..z_]> \w* $ /;

    Има една разлика, за която да знаете: \w в Raku се съобразява с Unicode, така че име като café също минава — което, между другото, съвпада с поведението на самия Raku, където my $café = 1; е напълно законно. Разписаният клас <[A..Za..z0..9_]> държи проверката строго в рамките на ASCII.

  4. Има обаче една уловка: в самия Raku my-var е валиден идентификатор! Raku допуска тире (или апостроф, както в isn't) вътре в името, стига след него да следва буква — затова подпрограми като is-prime се четат толкова естествено. За да проверявате идентификатори на Raku, допуснете такива групи след класическата част:

    for <count total2 2fast my-var _hidden> -> $name {
        my $ok = $name ~~ / ^ <[A..Za..z_]> \w* [ '-' <[A..Za..z]> \w* ]* $ /;
    
        say "$name: { $ok ?? 'valid' !! 'invalid' }";
    }

    Всяка група в скоби [ '-' <[A..Za..z]> \w* ] приема тире само когато след него следва буква, така че my-var вече се смята за валиден, а 2fast — както и низове като a- или a-1 — все още не.

Навигация в курса

Проверете идентификатори   |   Граматика за пълни имена