2016-10-26 2 views
1

나는 아래의 체계 정의 세트로 작업하고있다. 내 질문은 특히 "꼬리"기능에 관한 것입니다. 여분의 괄호 집합을 사용하면 함수가 목록 대신 인수로 프로 시저를 기대하게됩니다.이 경우 괄호 집합 하나가 사용됩니다. 이 형식이 잘못 또는 부적절한 질문이다 경우절차로서의 인수 - 체계

(define (make-stream n f) 
    (define (next m) 
    (cons m (lambda() (next (f m))))) 
    (next n)) 

(define head car) 

(define (tail stream) 
    ((cdr stream))) 

(define (nth stream n) 
    (if (= n 0) (head stream) 
     (nth (tail stream) (- n 1)))) 

(define even (make-stream 0 (lambda (n) (+ n 2)))) 

죄송합니다, 나는이 웹 사이트를 사용하는 방법을 배우려고 노력하고있다.

답변

1

제 질문은 구체적으로 "꼬리"기능입니다. 여분의 괄호 집합을 사용하면 함수가 목록 대신 인수로 프로 시저를 기대하게됩니다.이 경우 괄호 집합 하나가 사용됩니다.

여기에 프로 시저

(car (make-stream 0 f) ; => 0 
(cdr (make-stream 0 f) ; => (lambda() (next (f m))) 

이 null의는 car로 (제로 인수) 프로 시저 리턴이 Thunk라고 반환 무엇 carcdr에서

(define (make-stream n f) 
    (define (next m) 
    (cons m (lambda() (next (f m))))) 
    (next n)) 

하자의 첫 번째 모습입니다. 일반적으로 계산 평가를 지연시키는 데 사용됩니다. 이 경우 make-streammake-stream에 두 개의 인수가 제공되는 즉시 무한 반복되는 것을 방지하는 데 사용됩니다.

다음 값을 얻으려면 썽크를 적용하면됩니다. ... 추가 괄호를 대신 다음 cons를 반환합니다

(define (tail stream) ((cdr stream))) 

..., ...

(define (tail stream) (cdr stream)) 

을이 시간

당신이 볼 이유
((cdr (make-stream 0 f))) ;=> (next (f m)) 

을합니다. .. 다음을 포함하는 썽크를 반환합니다. cons

0

스키마에서 표현식은 다음 인수를 사용하여 계산할 메서드로 s- 식의 첫 번째 매개 변수. 예를 들어

:

(+ 1 2) 

우리는 약간의 예를 복잡하게하는 경우, 우리는 이런 일을 할 수 + 1, 2

그것은 적용된다.

(if (> x y) + -) 

다음은이 표현은 + 기호 또는 -를 반환합니다 하나. 우리는 조금 더 ... 이에 그 표현을 변형 할 수

((if (> x y) + -) 1 2) 

여기 if 발현 후 1 및 2로 적용될 + 또는 - 함수를 반환하거나.

이제 다시 시도하십시오!

(define (tail stream) 
    ((cdr stream))) 

보시다시피 이중 괄호가 있습니다. 이는 cdr에있는 기능을 stream에 적용한다는 의미입니다. 그것만큼이나 간단합니다.

스트림 생성자를 살펴보면 생성자가 두 번째 멤버로 람다 함수가 포함 된 쌍을 실제로 반환하고 있음을 알 수 있습니다.

make-stream의 두 번째 인수는 다음 번호를 생성하기 위해 호출되는 함수입니다. 메서드 f은 각 next 호출이 전달 될 필요가 없으므로 범위에서 사용할 수 있습니다.