2014-04-25 36 views
0

我想實現一個懶列表獲得2個數字爲論據:低& INT。拉姆達會返回一個可通過INT比低更大整除的所有整數的懶列表。方案:拉姆達回報#<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)不零時,您得到一個未定義的值。添加一個這樣的:

(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

非常感謝。我還有一個問題:你爲什麼使用空的lambda? –

+0

@PillPilon什麼空拉姆達?我沒有看到空的lambda。 –

+0

@PillPilon我同意克里斯。我不能選擇空身體的lambda。一個沒有正式表達式的lambda在那裏,但它也在你的實現中(通常稱爲thunk) – Sylwester