Лучше использовать «и» или «в» при объединении операторов «let»? - PullRequest
14 голосов
/ 15 июня 2011

Я понимаю, что это, вероятно, глупый вопрос, но ...

Если я объединяю в цепочку let операторов, которые не должны знать значения друг друга,лучше ли использовать and или in?

Например, какой из них предпочтителен, если таковой имеется:

let a = "foo"
and b = "bar"
and c = "baz"
in
  (* etc. *)

или

let a = "foo" in
let b = "bar" in
let c = "baz"
in
  (* etc. *)

Моя интуиция подсказывает мне, что первое должно быть «лучше» (по очень мелкому определению «лучше»), потому что оно создает минимальное количество необходимых областей, в то время как последнее - это «видимость в пределах видимости».область действия, которую компилятор / интерпретатор позаботится отметить, но в конечном итоге неважно и излишне глубоко.

Ответы [ 4 ]

4 голосов
/ 15 июня 2011

Мое мнение таково, что in лучше. Использование and подразумевает, что определения взаимно зависят друг от друга. Я думаю, что лучше понять, что это не так. С другой стороны, некоторые программисты OCaml предпочитают and для очень коротких определений, где немного более компактная запись может выглядеть чище. Это особенно верно, когда вы можете поместить определения в одну строку:

let a = "foo" and b = "bar" in
2 голосов
/ 21 июля 2011

Ответ на вопрос "что лучше?" только действительно имеет смысл, когда интерпретации не отличаются. Языки семейства ML (по крайней мере, SML и OCaml) имеют как параллельную форму инициализации (and), так и последовательную, по существу, вложенную область видимости (in), поскольку оба они полезны в определенных ситуациях.

В вашем случае семантика одна и та же, так что вам остается ответить на вопрос "что вам лучше читать?" и может быть (если это не преждевременно) "что может быть выполнено более эффективно?" В вашем случае альтернативы:

  • Для случая and: оцените несколько строк и выполните параллельное связывание с тремя идентификаторами.

  • Для случая in: связать foo с a, , затем , связать bar с b, , затем , связать baz с c.

Что читается лучше? Это бросок в этом случае, потому что результат не имеет значения. Вы можете опросить некоторых носителей английского языка, но я сомневаюсь, что будет много предпочтений. Возможно, большинству понравится and, поскольку он разделяет привязки, оставляя подошву in перед выражением.

Что касается того, что выполняется более эффективно, я думаю, что хороший компилятор, скорее всего, выдаст тот же код, потому что он может определять порядок связывания, не имеет значения. Но, возможно, у вас есть компилятор, который генерирует код для многоядерного процессора, который лучше работает с and. Или, может быть, наивный компилятор, который записывает все RHS во временное хранилище, а затем связывает их, замедляя дело and.

Это, скорее всего, несущественные проблемы оптимизации, особенно с учетом того, что они связаны с привязками и, вероятно, не имеют замкнутых циклов.

Итог: в данном случае это true ; просто убедитесь, что правильно используете параллельный или последовательный, когда результат имеет значение.

2 голосов
/ 15 июня 2011

Полагаю, это то же самое, что разница между let и let* в Лиспе.let* (схожий по функциональности со структурой in..in.. - вторая структура в вашем вопросе) иногда используется для скрытия императивного программирования, поскольку оно гарантирует последовательное выполнение выражений (см., Что сказал Пол Грэм оlet * in On Lisp ).

Итак, я бы сказал, что предыдущая конструкция лучше.Но правда в том, что я думаю, что последнее чаще встречается в программах Ocaml, которые я видел.Вероятно, это проще использовать, позволяя строить на основе ранее названных выражений.

1 голос
/ 15 июня 2011

Я бы сказал, лучше, потому что это уменьшает область и лучше выражает намерение. Если я увижу, что все эти определения объединены в единую область видимости, у меня сложится впечатление, что это было сделано по какой-то причине, и я буду искать, как они влияют друг на друга.

...