【问题标题】:How would I store a value into read for Scheme? Or is that not even possible?我如何将值存储到读方案中?或者这甚至不可能?
【发布时间】:2015-11-13 23:39:31
【问题描述】:
(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 两次,它被调用两次然后中断程序。有没有办法让我将用户输入的任何内容存储到变量中,然后在整个程序中使用该变量?或者这个问题有其他解决方案吗?

【问题讨论】:

    标签: list scheme lisp cdr


    【解决方案1】:

    请注意,您必须只执行一次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)
    

    【讨论】:

    • 请注意,在函数 getFirstFew 中包含 read 具有高度误导性,应被视为错误的代码样式 IMO。函数take N lstgetFirst N lst 会是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-03-21
    相关资源
    最近更新 更多