为什么 Crystal 的迭代宏语法与 Crystal 的其余部分不同
Why does Crystal's macro syntax for iterating differ from the rest of Crystal
来自Ruby世界,我瞬间明白了为什么Crystal选择不实现for
方法。但是后来我很惊讶地看到 Crystal 确实 为宏实现了一个 for
方法。我更惊讶地发现宏不允许可枚举的(.each
,等)语法(即 {% ["one", "two", "three"].each do |value| %}
不是有效的宏语法)。
这种语法差异是否有逻辑上的原因?答案可能只是简单的 ~"because the devs decided that macro syntax looks like x, and non-macro syntax looks like y",但我 猜测 还有更多(任意语法不一致似乎是一个缺陷)。
谢谢!
主要是解析器在解析foo.bar do |arg| ... end
时期望的是|arg|
后面的表达式,而不是%}
,这是解析错误。因此,为了允许我们需要增强解析器(已经相当复杂)以将其考虑在内。 for
是因为这个原因决定的,但也是为了明确它不是常规的 crystal 而是不同的东西(它是 crystal 和标准库的解释子集)。
还有一个原因就是如果允许each
等迭代方式,为什么不可以while
和until
呢?这可能会导致宏中出现无限循环,而仅使用 for
是不可能的,因此您可以保证宏完成执行。考虑到我们在宏中有 run
,这实际上是不正确的。
所以我认为我不反对更改语言以允许在宏内部使用 each
、each_with_index
等,并允许使用该语法,并最终删除 for
来自宏语言。打开一个问题请求这是朝这个方向发展的好方法。
来自Ruby世界,我瞬间明白了为什么Crystal选择不实现for
方法。但是后来我很惊讶地看到 Crystal 确实 为宏实现了一个 for
方法。我更惊讶地发现宏不允许可枚举的(.each
,等)语法(即 {% ["one", "two", "three"].each do |value| %}
不是有效的宏语法)。
这种语法差异是否有逻辑上的原因?答案可能只是简单的 ~"because the devs decided that macro syntax looks like x, and non-macro syntax looks like y",但我 猜测 还有更多(任意语法不一致似乎是一个缺陷)。
谢谢!
主要是解析器在解析foo.bar do |arg| ... end
时期望的是|arg|
后面的表达式,而不是%}
,这是解析错误。因此,为了允许我们需要增强解析器(已经相当复杂)以将其考虑在内。 for
是因为这个原因决定的,但也是为了明确它不是常规的 crystal 而是不同的东西(它是 crystal 和标准库的解释子集)。
还有一个原因就是如果允许each
等迭代方式,为什么不可以while
和until
呢?这可能会导致宏中出现无限循环,而仅使用 for
是不可能的,因此您可以保证宏完成执行。考虑到我们在宏中有 run
,这实际上是不正确的。
所以我认为我不反对更改语言以允许在宏内部使用 each
、each_with_index
等,并允许使用该语法,并最终删除 for
来自宏语言。打开一个问题请求这是朝这个方向发展的好方法。