Scheme

2017-11-07 18 views
2

Dr. Racket 사용자의 람다 식 평가 순서.Scheme

((람다 (X) (+ X 1)) 3)

((람다 (X) (+ X 1) 2) 3) :

여기서 두 표현식

첫번째 그래서 피연산자 및 브랜드 (람다로 (3)를 소요 한 입력을 받아, 1만큼 그것을 증가 람다 식 (3) (+ 4

받는 동일한 3 1) 두 번째 것은 나에게 매우 모호합니다. 그것은 2로 평가되고 나는 평가의 순서를 이해할 수 없다. 나는 순서를 바꾸는 괄호로 뭔가를해야한다는 것을 알고 있지만 어떻게 이해할 수는 없다. 분명히 출력으로 2를 만들어내는 웬일인지 "1"과 "x"를 합산하지 않습니다. 평가에 대한 기본적인 이해가 부족합니다. 미리 감사드립니다!

+0

DrRacket의 대수 스테퍼 (발)를 사용하여이 질문에 답하십시오. 스테퍼를 사용하면 식의 평가를 한 단계 씩 진행할 수 있습니다 (또한 뒤로 이동하기도 함). – soegaard

답변

6

은 라켓 docs에 명시된 바와 같이 :

함수의 정의는 함수의 몸에 여러 표현을 포함 할 수 있습니다. 이 경우 함수가 호출 될 때 마지막 표현식의 값만이 반환됩니다. 다른 표현식은 인쇄와 같은 부작용에 대해서만 평가됩니다. 예를 들어

:

(define (f x) 
    (+ 1 1)    ;; evaluates to 2, but not returned  
    (= 3 4)    ;; evaluates to false, but not returned 
    0     ;; evaluates to 0, but not returned 
    1000     ;; evaluates to 1000, but not returned 
    pi     ;; evaluates to pi, but not returned 
    "I am a string")  ;; last expression; evaluates and returns "I am a string" 

(f 10) 
=> "I am a string" 
(f 'okay) 
=> "I am a string" 
(f pi) 
=> "I am a string" 

같은 일이 마지막 람다에서 어떤 일이 일어나고, 이에 : 모든 파생 된 형태의

((lambda (x) (+ x 1) 2) 3) 
=> ((lambda() (+ 3 1) 2)) 
=> ((lambda() 4 2)) ;; last expression is 2, so output 2 
=> 2 
1

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는 반대 순서로 평가한다는 것을 알고있다.