方案:lambda返回#<void>而不是</void>

时间:2014-04-25 09:57:54

标签: list scheme lazy-evaluation void lazylist

我想实现一个以2个数字作为参数的惰性列表:low&amp; INT。 lambda将返回所有整数的惰性列表,这些整数大于低并且可以被int整除。

例如:

> (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)))))

使用此实施时:

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

当我运行lambda时:

  

(take(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)

如何阻止lambda返回#<void>而不返回任何内容?

谢谢。

1 个答案:

答案 0 :(得分: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)

现在如果你在谓词不正确的时候没有任何元素,那么当yuu错误但不会继续下一个真值时,yuu不应该有任何意义:

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