我是lisp的新手。我试图从用户读取数字,并希望将其存储为列表。例如:如果用户输入1 2 3 4 5
,则列表将包含5个元素(1 2 3 4 5)
。我试过(parse-integer(read-line) :junk-allowed t)
,但它只返回第一个元素。我该怎么做?感谢。
答案 0 :(得分:6)
read
最简单的选择是要求用户输入列表(带有parens),然后只需拨打(read)
。
第二种选择是自己放置parens:
(read-from-string (concatenate 'string "(" (read-line) ")"))
请注意Lisp reader的强大功能可能会给您带来麻烦。例如,如果用户在您的提示下键入#.(start-ww3)
而不是(1 2 3)
,您可能无法及时到达您的防空洞。
这意味着,在您无法控制的文字上调用nil
时,必须将*read-eval*
绑定到read
。
parse-integer
最后,您可以在循环中调用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)))))