LISP:How 从用户那里读取数字并存储为列表
LISP:How to read numbers from user and store as a list
我是 lisp 的新手。我正在尝试从用户那里读取数字并将其存储为列表。例如:如果用户输入 1 2 3 4 5
,则列表将包含 5 个元素 (1 2 3 4 5)
。我试过 (parse-integer(read-line) :junk-allowed t)
但它 returns 只是第一个元素。我应该怎么做?谢谢
使用read
最简单的选择是要求用户输入列表(带括号)然后调用 (read)
。
第二种选择是自己放括号:
(read-from-string (concatenate 'string "(" (read-line) ")"))
安全保障
请注意,在提示时 Lisp reader can put you in trouble. E.g., if the user types #.(start-ww3)
而不是 (1 2 3)
的威力,您可能无法及时到达防空洞。
这意味着当在您无法控制的文本上调用 read
时,您 必须 将 *read-eval*
绑定到 nil
。
重复调用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)))))
我是 lisp 的新手。我正在尝试从用户那里读取数字并将其存储为列表。例如:如果用户输入 1 2 3 4 5
,则列表将包含 5 个元素 (1 2 3 4 5)
。我试过 (parse-integer(read-line) :junk-allowed t)
但它 returns 只是第一个元素。我应该怎么做?谢谢
使用read
最简单的选择是要求用户输入列表(带括号)然后调用 (read)
。
第二种选择是自己放括号:
(read-from-string (concatenate 'string "(" (read-line) ")"))
安全保障
请注意,在提示时 Lisp reader can put you in trouble. E.g., if the user types #.(start-ww3)
而不是 (1 2 3)
的威力,您可能无法及时到达防空洞。
这意味着当在您无法控制的文本上调用 read
时,您 必须 将 *read-eval*
绑定到 nil
。
重复调用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)))))