首页 文章

如何扩展Crystal语言语法?

提问于
浏览
2

例如,我想获得看起来像原生的“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

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

    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"
    

相关问题