Как расширить синтаксис языка Crystal? - PullRequest
0 голосов
/ 23 мая 2018

Например, я хочу получить цикл «for», похожий на «родной», который был реализован во встроенном макроязыке Crystal, но отсутствует (по принципиальным соображениям) в основном языке «runtime»:

for i in list do
end

for k, v in hash do
end

(Здесь "{}" - простой блок. Я не могу использовать do .. end синтаксис здесь в любом случае (возможно, нет)).Будет очень хорошо реализовать директиву multi-inlcude, такую ​​как:

includes MixinX, MixinY, MixinZ

и так далее ... Как я знаю, макрос (названный "for" и "includes" в предоставленных фрагментах) может 'не принимать "я в списке" без двойных кавычек.Итак ... есть ли только один способ сделать это - расширить синтаксический / лексический синтаксический анализатор и сам анализатор кристалла?

1 Ответ

0 голосов
/ 23 мая 2018

Может быть, вы могли бы использовать что-то вроде этого:

module Foo
  def foo
    "foo"
  end
end

module Bar
  def bar
    "bar"
  end
end

class Object
  macro includes(*mods)
    {% for mod in mods %}
      include  {{ mod }}
      {% end %}
  end
end

class Baz
  includes Foo, Bar
end

Baz.new.foo # => "foo"
Baz.new.bar # => "bar"
...