Dr.racket初级功能

Dr.racket初级功能,racket,Racket,我是racket博士的初学者。我被要求编写一个函数来执行以下操作: 编写一个不消耗任何内容的函数“readnum”,每次调用该函数时,它将生成已定义列表的第n个数字 例如: (定义一个(列表02-50)) readnum-->0(第一次调用readnum) readnum-->2(第二次调用readnum) readnum-->-5(第三次调用readnum) 你不必担心列表中有数字或没有数字可供阅读 racket博士是一种函数式语言,对变量进行变异并将其用作计数器是非常不方便的,在这个问题中,

我是racket博士的初学者。我被要求编写一个函数来执行以下操作: 编写一个不消耗任何内容的函数“readnum”,每次调用该函数时,它将生成已定义列表的第n个数字

例如:

(定义一个(列表02-50))

readnum-->0(第一次调用readnum)

readnum-->2(第二次调用readnum)

readnum-->-5(第三次调用readnum)

你不必担心列表中有数字或没有数字可供阅读

racket博士是一种函数式语言,对变量进行变异并将其用作计数器是非常不方便的,在这个问题中,我不允许定义其他全局函数和变量(尽管允许使用局部函数)。 以下是我的尝试,但似乎不起作用:

(define counter -1)
(define lstofnum (list 5 10 15 20 32 3 2))
(define (read-num)
((begin(set! counter (+ 1 counter)))
(list-ref lstofnum counter)))
我不仅定义了不允许的全局变量,而且输出也不太正确


任何帮助都将不胜感激,谢谢

这里的诀窍是在实际定义函数之前声明一个局部变量,这样状态将在闭包中,我们可以根据需要对其进行更新

我们可以使用
list ref
实现一个解决方案并保存当前索引,但不建议这样做。最好将列表和
cdr
存储到列表的末尾,这就是我的意思:

(define lstofnum (list 0 2 -5 0))

(define readnum
  (let ((lst lstofnum))              ; list defined outside will be hardcoded
    (lambda ()                       ; define no-args function
      (if (null? lst)                ; not required by problem, but still...
          #f                         ; return #f when the list is finished
          (let ((current (car lst))) ; save the current element
            (set! lst (cdr lst))     ; update list
            current)))))             ; return current element
它按预期工作:

(readnum)
=>  0
(readnum)
=>  2
(readnum)
=> -5
(readnum)
=> 0
(readnum)
=> #f

对于新手读者:
cdr
获取一对中的第二个元素<代码>汽车获取配对的第一个元素。欢迎使用StackOverflow。这是一篇很棒的第一篇文章,你清楚准确地解释了你的问题,并举例说明了你所做的尝试以及为什么你认为它不起作用+1.