2012-09-17 4 views
2

나는 sicp의 5 장을 읽었으며 코드 조각, 즉 5.2에 제시된 어셈블러에 붙어있다. 이것은 다음과 같습니다.SICP 5.2 어셈블러

(define (extract-labels text receive) 
    (if (null? text) 
     (receive '() '()) 
     (extract-labels (cdr text) 
     (lambda (insts labels) 
      (let ((next-inst (car text))) 
       (if (symbol? next-inst) 
        (receive insts 
          (cons (make-label-entry next-inst insts) 
            labels)) 
        (receive (cons (make-instruction next-inst) insts) 
           lables))))))) 

텍스트가 null 일 때만 람다가 호출되지 않습니까? 그렇다면 우리는 어떻게 '텍스트'의 차를 요구할 수 있습니까?

편집

답변을 주셔서 감사합니다,하지만 난 여전히 그것을 확인할 수 없습니다. 텍스트가 null가 아닌 경우, 텍스트가 null가 될 때까지 추출 할 수 없습니다. 어떤 경우에 우리는 어떻게 그것의 차를 부를 수 있습니까?

답변

1

람다가 적절한 범위를 얻습니다. 람다가 정의 된 시점에 text이 null이 아니므로 car text을 호출하면 정상적으로 작동합니다. 조건하는 if-true (다음) 표현 및 if-false (다른) 표현 :

0

if는 세 개의 인수를 차지한다. 들여 쓰기가 모두 이상해서 잘못 보입니다. text가 null (extract-labels ...) 그렇지 (receive '() '()) 경우

(define (extract-labels text receive) 
    (if (null? text) 
     (receive '() '()) 
     (extract-labels (cdr text) 
      (lambda (insts labels) 
       (let ((next-inst (car text))) 
        (if (symbol? next-inst) 
         (receive insts 
           (cons (make-label-entry next-inst insts) 
             labels)) 
         (receive (cons (make-instruction next-inst) insts) 
            labels))))))) 

는 식의 결과임을 관찰

그것은 나타납니다.