【问题标题】:How to extend Crystal language syntax?如何扩展 Crystal 语言语法?
【发布时间】:2018-05-23 14:41:37
【问题描述】:

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

for i in list do
end

for k, v in hash do
end

(这里“{}”是一个简单的块。我不能在这里使用 do .. end 语法(也许不是))。 会很好的实现multi-inlcude指令,比如:

includes MixinX, MixinY, MixinZ

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

【问题讨论】:

    标签: macros crystal-lang


    【解决方案1】:

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

    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 的任何优势,因为我们已经有了each
    • 我不需要“for”运算符本身,我想知道是否可以使用宏“模拟”正常的本机语法,例如:“my_macro 空格分隔短语”。我认为,这可以通过 perl 中的“过滤”等某种预处理来完成,但这不太可能有朝一日在 Crystal 中实现......非常感谢您的回答,我会将其标记为解决方案。祝你好运! :)
    • @drvtiny 哦,误会了。实施运营商的难度将因人而异。如您所见,实现includes 非常容易,但我们可以想到“语法结构”(尤其是多行结构),如果不更改 Crystal 内部结构,实现起来会很棘手。附:我不是 Crystal 的大专家,所以由于您的问题没有得到很好的回答,也许值得取消选中它作为正确答案来吸引其他更有经验的用户的注意力。 :)
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2022-06-14
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多