我认为新手会被“做”弄糊涂,我从语言设计的角度对此表示怀疑。你不想在一个新语言生命的这个阶段混淆新手,几乎每个人都是新手,你想要新手来建立社区和临界质量; - )
'do'的文档(3.8.3。做或不做)说:
这种构造有一个很好的理由:在Opa中,每个函数定义(更常见的是每个不在顶层的值)以一个值结束,这是函数的结果 - 相反,一旦我们有了达到第一个值,我们得到函数的结果,所以函数完成。
这是我在上面加粗的部分,我想知道:为什么在达到第一个值后,函数完成了?为了避免在OCaml中看到这样的事情,是否“引入”?:
let _ = (some expression)
在Opa的语言设计中使用'do'的替代方法是什么?如何处理这个问题(从语言设计的角度来看)。
答案 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语法时,我们不太喜欢分号;)。所以:
x = ...
之前引入本地绑定(所以它比Ocaml更冗长:你不写let
而不写in
)do
引入最后一个空格类型的表达式,因此Opa中的Ocaml e1; e2
变为do e1 e2
(请注意,通常是你' d将e2
放在新行上。所以我认为与Ocaml相比,这里没有根本性的变化。但事实上,正如Cedrics在上面评论的那样,我们收到关于Opa语法的反复意见,并试图找出解决这个问题的最佳方法(欢迎提示)。