Макросы: оператор for

Случилось как-то раз мне заинтересоваться возможностями макросов в языке Crystal. Если честно, я даже как-то особо ни на что и не рассчитывал, да и нужны были самые базовые вещи. И какой же приятной неожиданностью стало для меня то, что макросы в Crystal оказались продуманным до мелочей простым и понятным встроенным языком с обалденным функционалом (по меркам макроязыков). При этом, пожалуй, макроязык в Crystal даже более элегантный и читабельный, чем основной, «рантаймовый».

Например, знаете ли вы что в Crystal нет оператора организации цикла for? Его нет ни в каком виде, разработчики принципиально отказались от старого доброго for в пользу итераторов «для всего».

Так вот, удивительное дело, но во встроенном языке макросов есть for (который по сути foreach), и он умеет:

# перебирать элементы списка
{% begin %}
    {% for k in ["a","b","c","d"] %}
    {% puts k.id %}
    puts {{k}}
    {% end %}
{% end %}

Первый puts «напечатает» имена элементов списка во время компиляции, а второй — станет частью сгенерированного реального кода программы и «сработает» в рантайме.

а ещё макро-for'ом можно:

# Перебирать пары ключ-значение в хешах
# ...и псевдохешах со статичными ключами (NamedTuple'ах)
{% begin %}

    {% for k,v in { "a"=>1, "b"=>2, "c"=>3, "d"=>4 } %}
    {% puts k.id + " => " + v.id.stringify %}
    puts %q({{k}} => {{v}})
    {% end %}
    
    {% for k,v in { type: "road", wheel_size: "700c", ett: "555mm", weight: 7.5 } %}
    {% puts k.id + " => " + v.stringify %}
    puts %q({{k}} => {{v}})
    {% end %}
    
{% end %}

Ну разве это не прекрасно? :)

А в следующий раз я расскажу вам немного об условной компиляции и о типе StringLiteral в макросах crystal'а

Держите руку на пульсе технологий с человечным интерфейсом и не переключайтесь!

0 комментариев