2

在 Common Lisp 中,我需要以实数列表的形式捕获用户输入。该列表以连续两个零结束。例如,5.0 0 6.0 3 2.0 5 1.0 7 13.0 8 0 0应该返回列表(5.0 0 6.0 3 2.0 5 1.0 7 13.0 8)

我遇到了 function read-delimited-list,它以单个字符作为结束点。我可以停在一个处,但我不确定如何扩展这个函数,而且我不知道另一个函数采用分隔字符串而不是字符。

编辑感谢接受的答案,我开发了以下内容:

(butlast (loop for y = -1 then x for x = (read stream) until (and (= 0 x) (= 0 y))
    collect x)))

它对我来说似乎更具可读性(此时我公开承认我的 Lisp 眼睛只有 3 天),而且我不确定性能影响(collect在循环退出范围后追加或反转列表? 有没有更简单的方法来切掉最后一个元素,或者干脆不附加它?)。

4

2 回答 2

4

对于这种简单的情况,您可以read在循环中使用,收集到目前为止读取的结果并在最后两个为零时停止。

(defun read-double-zero-terminated-list (stream)
  (do* ((prev -1 val)
        (val (read stream) (read stream))
        list)
       ((and (zerop prev) (zerop val)) (reverse (cdr list)))
     (push val list)))

read-delimited-list旨在用于创建专用语法的情况,因此在这里可能有点过分了。

于 2012-09-06T03:53:52.407 回答
0

在 Common Lisp 中解析数字的最佳方法是使用库parse-number。如果您的用户输入可以逐行读取,您可以简单地将行拆分为空格并用于parse-number结果。

于 2012-09-07T18:50:51.477 回答