【问题标题】:Why does Crystal's macro syntax for iterating differ from the rest of Crystal为什么 Crystal 的迭代宏语法与 Crystal 的其余部分不同
【发布时间】:2017-12-30 19:15:14
【问题描述】:

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

这种语法差异有逻辑上的原因吗?答案可能很简单~“因为开发人员认为宏语法看起来像 x,而非宏语法看起来像 y”,但我猜测还有更多内容(任意语法不一致似乎是一个缺陷)。

谢谢!

【问题讨论】:

  • 我猜宏语法有点像 Liquid 之类的模板引擎。
  • @JohannesMüller 如果他们只是模仿现有的模板语言,他们不应该使用 ERB 吗? (这对我来说似乎很明显,但也许并不明显?)也许他们尝试了常规 Crystal 语法之类的东西,但很难阅读。我很好奇这个思维过程是否记录在任何地方。
  • 我不确定它是否在最初的提案中发挥了作用,但 Crystal 的集成 ECR 模板使用了类似 ERB 的语法。对宏使用相同的语法会令人困惑,并且无法在 ECR 文件中使用宏(这不应该是一个很好的做法,但这是可能的)。
  • 你应该打开一个关于改变这个的问题。我会支持你提出的语法。就回答你的历史问题而言,这是玛纳斯团队的问题。

标签: crystal-lang


【解决方案1】:

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

另一个原因是,如果each和其他迭代方法都被允许,为什么不whileuntil呢?这可能会允许宏中出现无限循环,而仅使用for 是不可能的,因此您可以保证宏完成执行。鉴于我们在宏内部有 run,这实际上是不正确的。

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

【讨论】:

猜你喜欢
  • 2012-07-05
  • 2020-11-01
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多