将程序计划为 return 列表中的正数仅 returns t/f

Scheme program to return positive numbers in a list only returns t/f

我制作了这个程序来遍历列表中的数字,并且只 return 正数。这个逻辑似乎是正确的,但它是 returning #t#f 取决于它是否是积极的。

我如何得到这个 return 实际数字?它应该跳过负数。

(define (new-pos-iterator L)
  (let ((head L))          
    (lambda ()                   
      (if (null? head)  
          #f                  
          (let ((currN (>= (car head) 0))) 
            (set! head (cdr head)) 
            currN)
      )
    )
  )
)

(define pos (new-pos-iterator '(4 -1 -3 6)))

所以这个例子应该return调用时为 4,再次调用时为 6

它完全按照您写的那样执行。

变化很简单:

(define (new-pos-iterator L)
  (let ((head L))          
    (lambda ()                   
      (if (null? head)  
          #f                  
          (let ((currN ;; (>= (car head) 0)))   ;; was performing test too early
                       (car head)))
            (set! head (cdr head)) 
            ;; currN            ;; was returning the test result unconditionally
            (if ;; perform the test _now_:
               (>= currN 0)
                ;; is non-negative, return it
                _______    ;; fill the blanks
                ;; otherwise negative, skip it
                _______ )  ;; fill the blanks
            )))))

如何跳过呢?好吧,我们已经做到了,所以问题就变成了,如何 return 剩余列表中的第一个正成员? (好吧,非负数,但谁会关心差一错误,对吧?)。

难道我们(有点) 没有一个功能可以为我们做这件事吗?

如果我们命名它,我们可以再次调用它。再一次,根据需要。


那么,那里叫什么? (new-pos-iterator head)?

不,不是那样。它将 return 需要调用的生成器过程 -- (lambda () ...) 形式的结果。 那个是需要命名的;在自身内部调用;并将其命名,我们只是 return 是 (new-pos-iterator ...).

的结果

当然,命名——绑定——需要递归

letrec 这样做。

否则,我们可以使用内部使用 letrec 的命名循环对其进行编码。