Почему 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");
}();
Таким образом, длинным и коротким является то, что значения, которые не зависят от другого значения в той же области видимости, обрабатываются снизу вверх. Когда значение опирается на другое значение в той же области, оно обрабатывается отдельно и помещается внизу.
Это деталь реализации.