2009-12-30 4 views
1

Scheme 프로그래밍 언어를 사용하면 매크로 기능을 사용하지 않고 제어 구조를 구현하기 위해 지연/강제를 어떻게 사용합니까?지연/힘을 사용하여 매크로가없는 경우에도 제어 구조를 구현할 수 있습니까?

감사합니다.

+0

당신은 마음에있는 특정 제어 구조를 가지고? – mquander

+0

의미 : 'cond','delay','force' 및 매크로가 없다고 가정하고'if'와 같은 것을 구현합니까? – z5h

+0

cond가있는 경우 지연을 피하고 시행 할 필요가 없습니다. –

답변

2

대부분의 프로그래밍 언어는 인수를 중복하여 평가하지 않는 제어 흐름 구조를 지원합니다.

따라서 (and (expression_1) ... (expression_N))은 첫 번째 거짓 표현식이 발견되는대로 즉시 #f을 반환합니다.

and이 단순히 Scheme의 함수 인 경우 해당 매개 변수는 모두 and의 구현 본문으로 이동하기 전에 평가되었을 것입니다. 이 문제를 해결하기 위해 구현할 방법이 없습니다.

매크로는 인수를 평가하지 않고 평가되기 전에 용어를 다시 작성합니다. if/cond/또는 /와 같은 제어 구조를 만들 수 있으며 이미 작업 할 수있는 한 가지는 가질 수 있습니다. 사실, lambda body는 호출 될 때까지 평가되지 않으므로 lazily로 평가 된 제어 흐름 문에 필요한 것은 모두 lambda와 매크로입니다.

이제 매크로를 사용하고 싶지 않으면 인수가 평가됩니다. 람다 (lambdas)로 포장해야합니다. 그렇지 않으면 지연 (delay)/강제 (force)를 사용할 수 있습니다. 그러나 당신은 통제 구조에 표현을 전달하지 않습니다. 당신은 무언가에 감싸 인 표현을 전달하고 있습니다. 좀 못생긴 것 같아.

다음은 람다를 사용한 고안된 예제입니다.

(define bool1 
    (lambda() 
    (display "evaluating bool1\n") 
    #t)) 


(define bool2 
    (lambda() 
    (display "evaluating bool2\n") 
    #t)) 

(define (_or b1 b2) 
    (if (b1) #t 
     (if (b2) #t #f))) 

(define (_and b1 b2) 
    (if (b1) (if (b2) #t #f) #f)) 

사용 :

> (_and bool1 bool2) 
evaluating bool1 
evaluating bool2 
#t 
> (_or bool1 bool2) 
evaluating bool1 
#t 
> 
관련 문제