몸 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
여기에는 평가 순서가 나와 있습니다. #!r6rs
과 같은 스키마 보고서의 함수에 대한 인수는 #lang racket
에 엄격하게 왼쪽에서 오른쪽으로 평가되지만 구현 (예 : 라켓)은 모든 순서를 선택할 수 있습니다. 예. #lang racket
에서
((lambda (a b c) (display "d"))
(display "a")
(display "b")
(display "c")
위의 코드는 항상 "ABCD"를 인쇄하는 동안
은 단지 중간과 마지막 먼저 평가하는 인수를 주문 당신이 알고하지 않기 때문에 계획에 6 가능한 결과 중 하나입니다 및 인쇄 것 질서를 평가할 때 일어난다. 나는 라켓이 물론 Scheme 코드를 왼쪽에서 오른쪽으로 평가하는 반면 Ikarus는 반대 순서로 평가한다는 것을 알고있다.
DrRacket의 대수 스테퍼 (발)를 사용하여이 질문에 답하십시오. 스테퍼를 사용하면 식의 평가를 한 단계 씩 진행할 수 있습니다 (또한 뒤로 이동하기도 함). – soegaard