Подтвердить что ты не робот

Почему Debug.log печатает в обратном порядке в Elm?

Рассмотрим эту программу:

import Graphics.Element exposing (..)
import Debug


main : Element
main =
  let
    one = Debug.log "one" 1
    two = Debug.log "two" 2
    three = Debug.log "three" 3
  in
    show "Hello"

Он выводит на консоль браузера следующее:

three: 3
two: 2
one: 1

Почему порядок отменен?

4b9b3361

Ответ 1

main =
  let
    one = Debug.log "one" 1
    two = Debug.log "two" 2
    three = Debug.log "three" 3
  in
    show "Hello"

Собственно скомпилируется до

var main = function () {
  var three = A2($Debug.log,
  "three",
  3);
  var two = A2($Debug.log,
  "two",
  2);
  var one = A2($Debug.log,
  "one",
  1);
  return $Graphics$Element.show("Hello");
}();

Обратите внимание на то, что порядок, похоже, перевернут. Если мы вводим другое значение, которое зависит от чего-то еще в привязке let, вместо этого выполняется следующее:

 main =
   let
     one = Debug.log "one" 1
     two = Debug.log "two" 2
     three = Debug.log "three" 3
     four = Debug.log "four" three + one
   in
     show "Hello"

превращается в

var main = function () {
  var three = A2($Debug.log,
  "three",
  3);
  var two = A2($Debug.log,
  "two",
  2);
  var one = A2($Debug.log,
  "one",
  1);
  var four = A2($Debug.log,
  "four",
  three) + one;
  return $Graphics$Element.show("Hello");
}();

Таким образом, длинным и коротким является то, что значения, которые не зависят от другого значения в той же области, обрабатываются снизу вверх. Когда значение зависит от другого значения в пределах одного и того же объема, оно обрабатывается отдельно и помещается снизу.

Это подробная информация о реализации.