为什么Opa语言需要'do'?

时间:2011-07-13 15:52:04

标签: opa

我认为新手会被“做”弄糊涂,我从语言设计的角度对此表示怀疑。你不想在一个新语言生命的这个阶段混淆新手,几乎每个人都是新手,你想要新手来建立社区和临界质量; - )

'do'的文档(3.8.3。做或不做)说:

  

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

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

let _ = (some expression)

在Opa的语言设计中使用'do'的替代方法是什么?如何处理这个问题(从语言设计的角度来看)。

2 个答案:

答案 0 :(得分:6)

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

例如:

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/

阅读评论。 ;)

答案 1 :(得分:2)

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

首先让我转过桌子并问你一个问题:为什么会让人感到困惑?

事实上,情况与Ocaml非常相似。最后一个值也是函数的返回值。如果你想在需要本地绑定let x = ... in ...之前“做”某事或对于返回void的函数你需要使用分号expr1; expr2

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

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

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