3

我认为新手会对“do”感到困惑,我想从语言设计的角度来看它。您不想在新语言生命的这个阶段混淆新手,在这个阶段几乎每个人都是新手,您需要新手来建立社区和临界质量;-)

“做”(3.8.3。做或不做)的文档说:

这种构造有一个很好的理由:在 Opa 中,每个函数定义(更一般地,每个不在顶层的值)都以一个值结束,这是函数的结果——相反,一旦我们达到第一个值,我们有函数的结果,所以函数是完整的

这是我在上面加粗的部分,我想知道:为什么在达到第一个值之后函数就完成了?是否引入了“do”以避免您在 OCaml 中看到的类似情况?:

let _ = (some expression)

在 Opa 的语言设计中使用“do”的替代方法是什么?否则怎么可能(从语言设计的角度来看)。

4

2 回答 2

6

没有直接的答案。 do当前的 OPA 语法需要它,但我们可以选择另一种哲学。

例如:

user_update(x) =
  line = <div>
     <div>{x.author}:</div>
     <div>{x.text}</div>
  </div>
  do Dom.transform([#conversation +<- line ])
  Dom.scroll_to_bottom(#conversation)

do需要知道该函数不会在该Dom.transform行结束,而是在下一行结束。正如您引用的书中所写:“......一旦我们达到第一个值,我们就有了函数的结果,所以函数是完整的。”

但如果使用类似 js 的语法,它可能是:

user_update(x) {
  line = <div>
     <div>{x.author}:</div>
     <div>{x.text}</div>
  </div>;
  Dom.transform([#conversation +<- line ]);
  Dom.scroll_to_bottom(#conversation)
}

我们已经收到了大量关于 OPA 语法的反馈和建议,我们正在努力寻找最佳方法。您可以阅读这篇文章以了解更多信息:

众包 OPA 语法 http://dutherenverseauborddelatable.wordpress.com/2011/05/30/crowdsourcing-the-syntax/

阅读评论。;)

于 2011-07-13T20:44:51.873 回答
2

这是一个非常好的问题,我不确定我是否有一个好的答案。不过让我试试。

让我首先转身问你一个问题:为什么会令人困惑?

其实情况和Ocaml很相似。还有最后一个值是函数的返回值。如果您想在需要本地绑定let x = ... in ...或返回 void 的函数之前“做”某事,则需要使用分号expr1; expr2

在创建 Opa 语法时,我们不太喜欢分号 ;)。所以:

  • 在 Opa 中,最后一个值也是函数的返回值,
  • 你也可以在之前引入本地绑定x = ...(所以它比 Ocaml 更冗长:你不写let也不写in
  • 我们不使用分号,而是在最后一个之前引入了 void 类型的表达式,因此Opa 中do的 Ocaml变为(请注意,通常您会换行)。e1; e2do e1 e2e2

所以我认为这里与 Ocaml 相比没有根本性的变化。但实际上正如 Cedrics 上面评论的那样,我们收到了关于 Opa 语法的混合反馈,并试图找出解决这个问题的最佳方法(欢迎提出想法)。

于 2011-07-13T20:57:42.220 回答