list - 我如何将值存储到 Scheme 的读取中?或者那是不可能的?

标签 list scheme lisp cdr

(define (getFirstFew lst)
  (cond
  ((= (read) 0) '()) ;returns nothing
  (else(cons (car lst)(getFirstFew (cdr lst)(- (read) 1))))))

这是我上面的代码。所以我正在尝试编写一个程序,它将从列表中获取第一个 x 元素(用户可以选择 x 是什么)。例如,使用 (getFirstFew '(1 6 2 4 5)) 输入 4 将导致 '(1 6 2 4)。

我目前的问题是,使用 read 两次,它会被调用两次,然后中断程序。有没有办法将用户输入的任何内容存储到变量中,然后在整个程序中使用该变量?或者这个问题有另一种解决方案吗?

最佳答案

请注意,您只需一次 执行read,并存储该值以供将来引用。通常我们会使用 let为此,但鉴于我们还必须遍历列表并在每次迭代中递减 xnamed let会更合适。试试这个:

(define (getFirstFew lst)
  (let loop ((lst lst) (x (read)))
    (if (= x 0)
        '()
        (cons (car lst)
              (loop (cdr lst) (- x 1))))))

它按预期工作:

(getFirstFew '(1 6 2 4 5))
> 4
=> '(1 6 2 4)

关于list - 我如何将值存储到 Scheme 的读取中?或者那是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33703435/

相关文章:

c# - 如何在列表中查找字符串的索引

R - 将列表转换为数据帧

recursion - The Little Schemer Evens-only*&co

list - 方案/ Racket : A function which separates a list into two lists of elements that match a certain predicate and those that don't match it

list - Lisp,如何从列表中删除元素列表?

python-2.7 - 将 Python 翻译成 Scheme/Racket

python - 如何增加列表中每个项目/元素的值?

c# - 我可以将包含对象的列表转换为二维数组吗

list - 在Scheme中仅使用CONS命令写入列表

scheme - 方案中的数组表示