来自Ruby世界,我立即明白为什么Crystal选择不实施for
方法。但后来我惊讶地发现Crystal确实为宏实现了for
方法。我更惊讶地发现宏不允许使用可枚举(.each
等)语法(即{% ["one", "two", "three"].each do |value| %}
不是有效的宏语法)。
这种语法差异是否有合理的原因?答案很可能就是〜“因为开发人员认为宏语法看起来像x,而非宏语法看起来像y”,但我猜测它还有更多的东西(任意语法不一致似乎一个缺陷)。
谢谢!
主要原因是当解析器解析foo.bar do |arg| ... end
时,它需要一个|arg|
之后的表达式,而不是%}
,这是一个解析错误。因此,为了考虑到这一点,我们需要增强解析器(已经非常复杂)。 for
因此决定,但也明确表示它不是常规水晶而是另一种东西(它是水晶和标准库的解释子集)。
另一个原因是,如果允许each
和其他迭代方法,为什么不while
和until
?这可能允许宏中的无限循环,只有for
是不可能的,所以你可以保证宏完成执行。鉴于我们在宏内部有run
,其中......实际上并不正确。
所以我认为我不反对改变语言允许each
,each_with_index
等,在宏内部,并允许该语法,并最终从宏语言中删除for
。打开一个问题请求这是一个很好的方法。