2016-11-02 8 views
0

'when'의 구현 방식은 무엇이 다른가요?'when'을 함수로 구현할 때와 매크로로 구현할 때의 차이점

(define-syntax when 
    (syntax-rules() 
    ((_ pred b1 ...) 
    (if pred (begin b1 ...))))) 

비교 예

(define (my-when pred b1 ...) 
    (if pred (begin b1 ...))) 

때 '내-때'는 루프 매크로이 사용된다 :

(define-syntax for 
    (syntax-rules() 
    ((_ (i from to) b1 ...) 
    (let loop((i from)) 
     (my-when (< i to) 
        b1 ... 
        (loop (+ i 1))))))) 

에러가 발생

((i010) (디스플레이 i)에 대해)

; 중단! : 최대 재귀 깊이 함수로 구현 될 수있다 '때'는 내가 생각하지 않지만, 내가 왜 모르는

을 초과 ... 당신이했던 것처럼

답변

0

스키마에는 엄격한 의미가 있습니다.

이것은 함수의 모든 매개 변수가 함수에 적용되기 전에 평가된다는 것을 의미합니다.

매크로는 소스 코드를 가져 와서 소스 코드를 생성합니다. 매크로는 매개 변수를 평가하지 않습니다.

(또는 글쎄요, 그렇겠지 만, 매개 변수는 숫자 또는 문자열과 같이 값으로 생각하는 것보다는 구문 언어 요소입니다. 매크로 프로그래밍은 메타 프로그래밍입니다.

예에서 이것은 my-when이 함수 인 경우, (loop (+ i 1))이 평가 되어야만 my-when이 적용될 수 있음을 의미합니다.
이렇게하면 무한 재귀가 발생합니다.

그것은 매크로의의 my-when 형태는 첫째 조건에 해당하는 경우 (loop (+ i 1)) 만 평가됩니다 것을 의미에 해당하는 if

(if (< i to) 
    (begin 
     b1 ... 
     (loop (+ i 1)))) 

후 모든 것이 평가로 대체된다.

+0

멋진 설명! 조건이 참일 때 (loop (+ i 1)) 만 평가되는 이유를 명확히 할 수 있습니까? 내게는 'when'매크로가 if 문에서 루프를 "사용"하지 않는 것처럼 조건이 false 인 경우에만 평가되는 것처럼 보입니다. – wes

+0

@wes 루프는'my-when' 매크로의 ".. :"부분입니다. 편집이 도움이되기를 바랍니다. – molbdnilo

0

당신이 프로 시저로 when을 구현하는 경우 , 모든 인수가 평가됩니다. 당신의 for 구현에서, 평가는 다음과 같이 처리 할 것 :

  1. (loop (+ i 1)) <을 평가 b1 ...의 확장 결과를 평가 (< i to) 평가 - 여기에 무한 루프로 간다!
  2. my-when

항목 1-3 역전 될 수있다 또는 정의되지 않은 순서는 구현에 따라하지만 요점은 NR입니다 평가합니다. 4. my-when이 매크로로 구현 된 경우 매크로는 평가할 첫 번째 매크로입니다.

프로 시저로 구현해야하는 경우 썽크와 같은 지연 트릭을 사용해야합니다. 예 :

(define (my-when pred body) (if (pred) (body))) 
(my-when (lambda() (< i 10)) (lambda() (display i) (loop (+ i 1))))