List LISP:如何从用户处读取数字并存储为列表
我是lisp的新手。我试图从用户那里读取数字,并希望将其存储为列表。例如:如果用户输入List LISP:如何从用户处读取数字并存储为列表,list,lisp,common-lisp,List,Lisp,Common Lisp,我是lisp的新手。我试图从用户那里读取数字,并希望将其存储为列表。例如:如果用户输入123445,则列表将包含5个元素(123445)。我尝试了(解析整数(读取行):t),但它只返回第一个元素。我该怎么做?谢谢。使用阅读 最简单的选择是要求用户输入列表(带参数),然后直接调用 第二种选择是让帕伦夫妇自己: (read-from-string (concatenate 'string "(" (read-line) ")")) 安全和安保 请注意,的权力,可以把你的麻烦。例如,如果用户在您的提
123445
,则列表将包含5个元素(123445)
。我尝试了(解析整数(读取行):t)
,但它只返回第一个元素。我该怎么做?谢谢。使用阅读
最简单的选择是要求用户输入列表(带参数),然后直接调用
第二种选择是让帕伦夫妇自己:
(read-from-string (concatenate 'string "(" (read-line) ")"))
安全和安保
请注意,的权力,可以把你的麻烦。例如,如果用户在您的提示下键入而不是(1 2 3)
,则您可能无法及时到达防空洞
这意味着您在对不受控制的文本调用read
时必须绑定到nil
反复调用parse integer
最后,您可以调用一个循环
(defun parse-integers (s &optional (start 0))
(loop with num do
(setf (values num start) (parse-integer s :start start :junk-allowed t))
while num collect num))
或递归地:
(defun parse-integers (s &optional (start 0))
(multiple-value-bind (num end)
(parse-integer s :start start :junk-allowed t)
(and num (cons num (parse-integers s end)))))
在循环中调用解析器如何,每次都提前开始?parse integer返回的第二个值是一个位置,可以是下一次调用parse-integer的:start
位置。建议在用户输入时调用read
(不推荐),至少始终建议将*read eval*
绑定到nil
。