Тело всех производных форм от lambda
оценивается слева направо в порядке, как в begin
. Все выражения, кроме последнего, оцениваются только для побочного эффекта, а результат самого последнего выражения будет результатом вашей функции:
((lambda (x)
(+ x 1) ; not in tail position. no effect so it's dead code
2) ; the evaluation of 2 will be the result every time
3) ; argument, only used by dead code.
На самом деле он производит сумму, а затем отбрасывает ее, чтобы вычислить последнее выражение. Единственное хорошее применение мертвому коду — согреться зимой. Пример более разумного использования большего количества выражений в теле:
(define (hypopotemus a b)
(define (square x) ; Not in tail position, creates
(* x x)) ; a function as side effect.
(sqrt (+ (square a) (square b)))) ; Tail expression calculates the result
И так как это упоминает порядок оценки. В то время как аргументы функций оцениваются строго слева направо в #lang racket
во всех отчетах Scheme, таких как #!r6rs
, реализация (например, рэкет) может выбирать любой порядок. например.
((lambda (a b c) (display "d"))
(display "a")
(display "b")
(display "c")
Хотя приведенный выше код всегда печатает «abcd» в #lang racket
, это только один из 6 возможных результатов в схеме, поскольку вы не знаете, в каком порядке аргументы оцениваются первым, средним и последним, и печать будет происходить в порядке оценки. Я знаю, что рэкет, конечно, оценивает свой код схемы слева направо, в то время как Икарус делает это в обратном порядке.
person
Sylwester
schedule
07.11.2017