为什么Crystal的迭代宏语法与Crystal的其余部分不同

Joh*_*ohn 4 crystal-lang

来自Ruby世界,我立刻明白为什么Crystal选择不实现一个for方法.但后来我惊讶地发现Crystal 确实for为宏实现了一种方法.我更惊讶地发现宏不允许可枚举(.each等)语法(即{% ["one", "two", "three"].each do |value| %}不是有效的宏语法).

这种语法差异是否有合理的原因?答案很可能就是〜"因为开发人员认为宏语法看起来像x,而非宏语法看起来像y",但我猜测它还有更多的东西(任意语法不一致似乎一个缺陷).

谢谢!

ast*_*ite 6

主要原因是当解析器解析时foo.bar do |arg| ... end,它需要一个表达式|arg|,而不是%}一个解析错误.因此,为了考虑到这一点,我们需要增强解析器(已经非常复杂).for因为这个决定,但也明确表示它不是常规水晶而是另一种东西(它是水晶和标准库的解释子集).

另一个原因是,如果each允许和其他迭代方法,为什么不whileuntil?这可能允许宏中的无限循环,这for是不可能的,所以你可以保证宏完成执行.鉴于我们有run内部宏,其中......实际上并不正确.

所以我觉得我不反对更改语言允许each,each_with_index等等,里面的宏,并允许该语法,并最终移除for从宏语言.打开一个问题请求这是一个很好的方法.