【问题标题】:Scheme: A iterator function return only one value at the time方案:迭代器函数一次只返回一个值
【发布时间】:2018-07-26 03:04:35
【问题描述】:

可以说,我有一个函数range,它逐步返回一个数字列表,我已经实现了它,它运行良好。现在,我需要在上面写一个迭代器函数,所以如果我在列表上运行迭代器函数,它将超时返回列表的第一个元素。

(define next '(1 2 3 4))

(next) => 1
(next) => 2
(next) => 3
(next) => 4
(next) => '()

我的问题是我不知道什么类型的方案语法可以实现这一点,因为每次我们调用函数next 时,都会刷新意志。但是我需要实现下一个函数,这样如果我第二次调用列表中的下一个,列表不会被刷新,所以它会得到列表的第二项

我需要知道什么具体的方法来实现这一点,或者我需要修改我的range 函数来做到这一点。

我的迭代函数如下所示:

(define (iterator L)
    (let ((start (car L))
          (step (car (cdr L)))
          (end (car (cdr (cdr L))))
          )
        (lambda ()
            (if (> start end)
                '()
                (set! start
                    (+ start step)
                )
            )
        )
    )
)

我的下一个定义

(define next (iterator '(0 2 7)))

我的错误信息是:Error: execute: unbound symbol: "iterator" []

【问题讨论】:

  • 你的范围实现被破坏了,实际上它没有编译...
  • 我已回滚您的上次编辑(正如 Óscar López 建议的那样),因为它使答案无效。

标签: list iterator scheme


【解决方案1】:

首先,您的range 代码中有一个错误:

(define (range L)
  (let ((start (car L))
        (step (car (cdr L)))
        (end (car (cdr (cdr L)))))
    (if (> start end)
        '() ; fix this line
        (cons start (range (list (+ start step) step end))))))

现在,要创建一个迭代器,我们需要在我们的过程中引入 state,以记住我们在迭代的每个步骤中所处的位置。还要注意这里有两个独立的概念:迭代器和推进它的过程,我们可以使用柯里化来返回next过程。这是我的建议:

(define (iter lst)
  (let ((pos lst))               ; store current position
    (lambda ()                   ; return the `next` procedure
      (if (null? pos)            ; are we done?
          '()                    ; then exit
          (let ((cur (car pos))) ; current element
            (set! pos (cdr pos)) ; advance & update state
            cur)))))             ; return current           

像这样使用它:

(define next (iter (range '(1 1 3))))
(next)
=> 1
(next) 
=> 2
(next)
=> 3
(next)
=> '()

【讨论】:

  • 我已经根据您上面的逻辑编写了自己的迭代函数,但是我遇到了一个语法错误,我似乎无法理解为什么,请您看一下。
  • 我没有收到那个错误。如果我键入您的代码,它会编译,但 (next) 根本不返回任何内容。请接受这个问题并发布一个新问题,因为这是一个不同的问题。另外,我会将问题恢复为原始形式。
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 2016-09-06
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 2020-11-20
相关资源
最近更新 更多