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

问题描述 投票:4回答:1

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

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

谢谢!

crystal-lang
1个回答
6
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.