Input 在Lisp中读取分隔输入

Input 在Lisp中读取分隔输入,input,lisp,Input,Lisp,在CommonLisp中,我需要以real列表的形式捕获用户输入。此列表在一行中以两个零结尾。例如,5.066.032.051.0713.0800应返回列表(5.066.032.051.0713.088) 我遇到了函数read delimited list,它以一个字符作为结束点。我可以停在一个零上,但我不知道如何扩展这个函数,我也不知道还有哪个函数使用分隔字符串而不是字符 编辑由于接受了答案,我开发了以下内容: (butlast (loop for y = -1 then x for x =

在CommonLisp中,我需要以real列表的形式捕获用户输入。此列表在一行中以两个零结尾。例如,
5.066.032.051.0713.0800
应返回列表
(5.066.032.051.0713.088)

我遇到了函数
read delimited list
,它以一个字符作为结束点。我可以停在一个零上,但我不知道如何扩展这个函数,我也不知道还有哪个函数使用分隔字符串而不是字符

编辑由于接受了答案,我开发了以下内容:

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

对我来说,它似乎更具可读性(在这一点上,我公开承认我的Lisp眼睛只有3天大),而且我不确定性能影响(循环退出作用域后是否附加或反转列表?是否有更简单的方法切掉最后一个元素,或者干脆不附加它?).

对于这种简单的情况,您可以在循环中使用
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
适用于创建专用语法的情况,因此这里可能有些过分。

对于这种简单的情况,您可以在循环中使用
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
用于创建专门语法的情况,因此在这里可能有些过分。

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

在Common Lisp中解析编号的最佳方法是使用库
解析编号
。如果您的用户输入可以逐行读取,您可以简单地在空白处拆分行,并在结果上使用
解析数字

不是过度使用,而是完全错误<代码>读取分隔列表在字符级输入下工作。。。我打赌埃弗里茨不想停在
0.17
上。你为什么要用do*?在我看来,它似乎也适用于do循环。请记住,在这样使用
read
时,始终将
*read eval*
设置为
nil
,以防止
.
。不是过度杀戮,只是完全错误<代码>读取分隔列表在字符级输入下工作。。。我打赌埃弗里茨不想停在
0.17
上。你为什么要用do*?在我看来,它似乎也适用于do循环。请记住,在这样使用
read
时,始终将
*read eval*
设置为
nil
,以防止
.