Зачем "делать" на языке опа?
Я думаю, что новичков будет смущать "делать", и мне интересно это с точки зрения языкового дизайна. Вы не хотите путать новичков на этом этапе жизни нового языка, где почти все новички, и вы хотите новичков, чтобы создать сообщество и критическую массу;-)
Документация для "делать" (3.8.3. Делать или не делать) гласит:
Есть очень веская причина для такой конструкции: в Opa каждое определение функции (и, в более общем случае, каждое значение, не имеющее верхнего уровня) заканчивается одним значением, которое является результатом функции - наоборот, как только мы достигли первого значения, мы есть результат функции, поэтому функция завершена.
Меня интересует та часть, о которой я говорил выше: почему после достижения первого значения функция завершена? Было ли введено "do", чтобы избежать подобных вещей, которые вы видите в OCaml?:
let _ = (some expression)
Каковы альтернативы использованию "do" в языковом дизайне Opa? Как еще можно было бы подойти (с точки зрения языкового дизайна).
2 ответа
Прямого ответа нет.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/
Читайте также комментарии.;)
Это очень хороший вопрос, на который я не уверен, что у меня есть хороший ответ. Позвольте мне попробовать, хотя.
Позвольте мне начать с поворота столов и задать вам вопрос: почему это сбивает с толку?
На самом деле ситуация очень похожа на Ocaml. Там также последнее значение является возвращаемым значением функции. Если вы хотите что-то сделать, прежде чем вам понадобится локальная привязка let x = ... in ...
или для функций, возвращающих void, вам нужно использовать точку с запятой expr1; expr2
,
При создании синтаксиса Opa мы не очень любили точки с запятой;). Так:
- в Opa также последнее значение является возвращаемым значением функции,
- Вы также можете ввести местные привязки, прежде чем
x = ...
(так что это более многословно, чем Ocaml: ты не пишешьlet
и не пишиin
) - мы не используем точки с запятой вместо выражений типа void перед последним введением
do
так Окамлаe1; e2
в опа становитсяdo e1 e2
(заметьте, обычно вы быe2
на новой линии).
Поэтому я не думаю, что здесь есть принципиальные изменения по сравнению с Окамлем. Но на самом деле, как прокомментировал Cedrics выше, мы получаем смешанные отзывы о синтаксисе Opa и пытаемся найти лучший способ решения этой проблемы (идеи приветствуются).