Курс языка программирования Raku / Регулярные выражения и грамматики / Грамматики / Классы действий / Exercises / Сделайте дату человекочитаемой
Решение: Сделайте дату человекочитаемой
Вот один из возможных вариантов решения задачи.
Код
grammar Date {
token TOP { <year> '-' <month> '-' <day> }
token year { \d ** 4 }
token month { \d ** 2 }
token day { \d ** 2 }
}
class Humanise {
method year($/) { make $/.Int }
method month($/) { make <January February March April May June
July August September October November December>[$/ - 1] }
method day($/) { make $/.Int }
method TOP($/) { make "{$<day>.made} {$<month>.made} {$<year>.made}" }
}
say Date.parse('2026-07-05', actions => Humanise.new).made;🦋 Исходный код можно найти в файле humanise-a-date.raku.
Вывод
5 July 2026Комментарии
В отличие от простого арифметического действия, методы токенов делают значения разного рода:
yearиdayделают целые числа, аmonthделает строку, используя своё числовое значение как индекс в списке названий месяцев. Выражение$/ - 1приводит двузначное совпадение к числу (07→7) и сдвигает к индексу, считаемому с нуля, поэтому месяц07делаетJuly.Метод
TOPвообще не заглядывает в сырой текст. Он просто читает три значения, уже сделанные вложенными методами, —$<day>.made,$<month>.made,$<year>.made— и подставляет их в итоговую строку. Чтение5обратно изdayзаодно бесплатно убирает ведущий ноль.В этом и состоит повседневная работа класса действий: один раз разобрать структурированный ввод, а затем позволить каждому методу превратить свой кусочек в то, что нужно остальной программе.
Навигация по курсу
← Сделайте дату человекочитаемой | Функциональное, конкурентное, реактивное и веб-программирование →