如何扩展 Crystal 语言语法?
How to extend Crystal language syntax?
例如,我想获得看起来像本机的 "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")不能接受 "i in list" 而不用双引号。那么...是否只有一种方法可以做到这一点 - 扩展 crystal 的 syntax/lexical 解析器和分析器本身?
也许,你可以使用这样的东西:
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"
例如,我想获得看起来像本机的 "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")不能接受 "i in list" 而不用双引号。那么...是否只有一种方法可以做到这一点 - 扩展 crystal 的 syntax/lexical 解析器和分析器本身?
也许,你可以使用这样的东西:
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"