Input 在Lisp中读取分隔输入
在CommonLisp中,我需要以real列表的形式捕获用户输入。此列表在一行中以两个零结尾。例如,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 =
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
,以防止.
。