List LISP:如何从用户处读取数字并存储为列表

List LISP:如何从用户处读取数字并存储为列表,list,lisp,common-lisp,List,Lisp,Common Lisp,我是lisp的新手。我试图从用户那里读取数字,并希望将其存储为列表。例如:如果用户输入123445,则列表将包含5个元素(123445)。我尝试了(解析整数(读取行):t),但它只返回第一个元素。我该怎么做?谢谢。使用阅读 最简单的选择是要求用户输入列表(带参数),然后直接调用 第二种选择是让帕伦夫妇自己: (read-from-string (concatenate 'string "(" (read-line) ")")) 安全和安保 请注意,的权力,可以把你的麻烦。例如,如果用户在您的提

我是lisp的新手。我试图从用户那里读取数字,并希望将其存储为列表。例如:如果用户输入
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