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

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

这种语法差异是否有合理的原因?它's possible that the answer is simply ~ 1306603 , but I' m猜测它还有更多(任意语法不一致似乎是一个缺陷) .

谢谢!

回答(1)

3 years ago

主要原因是当解析器解析 foo.bar do |arg| ... end 时,它需要 |arg| 之后的表达式,而不是 %} ,这是一个解析错误 . 因此,为了考虑到这一点,我们需要增强解析器(已经非常复杂) . 由于这个原因决定 for ,但也要明确它's just not regular crystal but a different thing (it'是解释的水晶子集和标准库) .

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

所以我认为我不反对在宏内部更改语言以允许 eacheach_with_index 等,并允许该语法,并最终从宏语言中删除 for . 打开一个问题请求这是一个很好的方法 .