如何将用户输入存储到Scheme中的列表中?

如何将用户输入存储到Scheme中的列表中?,scheme,racket,Scheme,Racket,我需要能够从用户那里获取输入(将其存储在列表中),并将其打印到屏幕上,以证明它存储在列表中,或者如果列表包含的元素不是数字,则打印f。这样做的目的是在另一个函数中使用该函数的结果,从而得到和(我已经做了该函数)。我已到处寻找,找不到任何关于如何在计划中做到这一点的信息。我知道必须使用let,但我不确定如何实现它 (读取用户ints) =>1 =>2 =>3 =>4 =>5 =>e (1 2 3 4 5)首先定义e为空列表 (define e '()) 然后,您可以使用带有READ的递归循环来获

我需要能够从用户那里获取输入(将其存储在列表中),并将其打印到屏幕上,以证明它存储在列表中,或者如果列表包含的元素不是数字,则打印f。这样做的目的是在另一个函数中使用该函数的结果,从而得到和(我已经做了该函数)。我已到处寻找,找不到任何关于如何在计划中做到这一点的信息。我知道必须使用let,但我不确定如何实现它

(读取用户ints)

=>1

=>2

=>3

=>4

=>5

=>e


(1 2 3 4 5)

首先定义e为空列表

(define e '())
然后,您可以使用带有READ的递归循环来获取int,每次获取int时,您可以将其附加到列表的末尾,如下所示:

(set! e (append e (list number)))
(define read-int-list
  (lambda ()
    (let loop ((number (read)))
      (if (number? number)
          (begin (set! e (append e (list number)))
                 (loop))
          'done
          ))))
如果你在努力学习LET部分,你可以这样做

(let loop ((number (read)))
    ;; check if number is actually a number or if it's 'e'
    ;; either append it or exit the loop (by not calling loop)
    )

回答您的后续评论

可以使用BEGIN在IF表达式的一个分支中放置多个语句,如下所示:

(set! e (append e (list number)))
(define read-int-list
  (lambda ()
    (let loop ((number (read)))
      (if (number? number)
          (begin (set! e (append e (list number)))
                 (loop))
          'done
          ))))

这需要时间,对吗?要获得线性时间,您可以
cons
将新元素放在前面,然后
reverse
读取字符e时,一次将它们全部反转。@SoraweePorncharoenwase如果您想单独问这个问题,我将向您展示有效的技术(定义读取整型列表(lambda()(let loop((number(read))(如果需要)(number?number)(set!e(append e(list number))))如何使其循环?目前它只允许一个输入exits@AlexSam将有关此的信息添加到答案
(定义(读取用户输入)(序列->列表(在生产者中读取(否定数字))