如何扩展Crystal语言语法?

例如,我想获得看起来像原生的“for”循环,它是用crystal的嵌入式宏语言实现的,但是在主要的“运行时”语言中缺少(出于原理的原因):

for i in list do
end

for k, v in hash do
end

(这里“{}”是一个简单的块 . 我无论如何都不能使用do .. end语法(也许不是)) . 将非常好地实现多inlcude指令,例如:

includes MixinX, MixinY, MixinZ

等等...据我所知,宏(在提供的片段中命名为“for”和“includes”)不能在没有双引号的情况下接受“i in list” . 所以......只有一种方法可以做到 - 扩展crystal的语法/词法解析器和分析器本身?

回答(1)

2 years ago

也许,你可以使用这样的东西:

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"