2014-04-25 4 views
0

인자로 2 개의 숫자를 얻는 지연 목록을 구현하고자합니다 : low & int. lambda는 low보다 크고 int로 나눌 수있는 모든 정수의 lazy-list를 반환합니다. 구현의구성표 : 람다 반환 # <void> 대신 아무 것도 없음

> (define lz1 (div-from 5 12)) 
> (take lz1 3) 
'(12 24 36) 

내 시도 :

>(define gen_item 
     (lambda (n int) 
      (cons (cond ((= 0 (modulo n int)) n)) 
       (lambda() (gen_item (+ n 1) int))))) 

것은이 implemenatation을 사용 : 예를 들어

>(define take 
(lambda (lz-lst n) 
(if (= n 0) 
(list) 
(cons (car lz-lst) 
(take (tail lz-lst) (sub1 n)))))) 

난 람다 실행하면 :

(테이크 (gen_item 5 ~ 12) 20)

반환 값 :

'(#<void>  #<void>  #<void>  #<void>  #<void> 
    #<void>  #<void>  12  #<void>  #<void> 
    #<void>  #<void>  #<void>  #<void>  #<void> 
    #<void>  #<void>  #<void>  #<void>  24) 

어떻게 내가 람다 반환 #<void>을 방지 할 수 있습니다 대신 아무 것도 반환하지?

감사합니다.

답변

1

cond에는 기본 사례가 없습니다. 따라서 (modulo n int)이 0이 아닌 경우 정의되지 않은 값을 얻습니다. 이 같은 하나를 추가

(cond (predicat-expression consequent-expression) 
     (predicat-expression2 consequent-expression2) 
     (else alternative-expression)) 

을 당신은 단지 당신이되지 않은 요소를 할 경우 지금 if

(if predicate-expression 
    consequent-expression 
    alternative-expression) 

이 할 수있는 하나 개의 필연적 인 표현을 가지고 있기 때문에 조건은 다음 유우해야하지 양론 사실이 아닌 경우 거짓 일 때 무엇이든 계속해서 다음 실제 값으로 넘어갑니다.

(define gen_item 
    (lambda (n int) 
    (if (= 0 (modulo n int)) 
     (cons n (lambda() (gen_item (+ n 1) int))) 
     (gen_item (+ n 1) int)))) 
+0

대단히 고마워요. 나는 여전히 한 가지 질문이 있습니다. 왜 빈 람다를 사용 했습니까? –

+0

@ 필illPilon 어떤 빈 람다? 나는 빈 람다를 보지 않는다. –

+0

@PillPilon 나는 Chris에 동의한다. 나는 빈 몸으로 람다를 볼 수 없다. 정식이없는 람다는 거기에 있지만 구현시에도 (일반적으로 썽크라고도 함) – Sylwester