Почему 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

Почему заказ отменен?

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");
}();

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

Это деталь реализации.

Другие вопросы по тегам