Macros 如何扩展Crystal语言语法?

Macros 如何扩展Crystal语言语法?,macros,crystal-lang,Macros,Crystal Lang,例如,我想让它看起来像本机的“For”循环,它是用crystal的嵌入式宏语言实现的,但它在主“runtime”语言中不存在(出于原则原因): for i in list do end for k, v in hash do end (这里的“{}”是一个简单的块。我不能在这里使用do..end语法(可能不是)。 将非常适合执行多入口指令,例如: includes MixinX, MixinY, MixinZ 等等。。。 据我所知,宏(在提供的代码段中命名为“for”和“includes”

例如,我想让它看起来像本机的“For”循环,它是用crystal的嵌入式宏语言实现的,但它在主“runtime”语言中不存在(出于原则原因):

for i in list do
end

for k, v in hash do
end
(这里的“{}”是一个简单的块。我不能在这里使用do..end语法(可能不是)。 将非常适合执行多入口指令,例如:

includes MixinX, MixinY, MixinZ
等等。。。
据我所知,宏(在提供的代码段中命名为“for”和“includes”)不能接受没有双引号的“列表中的i”。所以只有一种方法可以做到这一点——扩展crystal的语法/词法分析器和分析器本身吗?

也许,您可以使用以下方法:

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"

是的,当然,mods!这真是太棒了:)那你的工作呢?它可以用宏实现吗?@drvtiny我不知道怎么做,对不起。就我个人而言,我不会这么做,因为我看不到使用
for
的任何好处,因为我们已经有了
每个
。我不需要“for”操作符本身,我想知道是否可以使用宏“模拟”正常的本机语法,例如:“my_macro space separated phrase”。我认为,这可以通过某种预处理来完成,比如perl中的“过滤”,但这不太可能有一天在Crystal中实现。。。非常感谢你的回答,我将把它记为决议。祝你好运!:)@哦,抱歉误会了。实施操作员的难度将是个人的。正如您所看到的,实现
includes
非常容易,但我们可以想到“语法结构”(尤其是多行结构),在不改变Crystal内部结构的情况下实现起来很困难。另外,我不是Crystal的专家,因此,由于您的问题没有得到完全的回答,也许值得取消选中它作为一个正确的答案,以吸引其他更有经验的用户的注意。:)