我想实现一个以2个数字作为参数的惰性列表:low& 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>
而不返回任何内容?
谢谢。
答案 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))))