0

我想实现一个惰性列表,它以 2 个数字作为参数:low & int。lambda 将返回所有大于 low 且可被 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 时:

(取(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>并且什么都不返回?

谢谢你。

4

1 回答 1

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 不应该做任何事情,而是继续下一个真值:

(define gen_item 
  (lambda (n int)
    (if (= 0 (modulo n int))
        (cons n (lambda () (gen_item (+  n 1) int)))
        (gen_item (+  n 1) int))))
于 2014-04-25T10:03:46.990 回答