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

时间:2015-10-25 15:35:04

标签: list lisp common-lisp

我是lisp的新手。我试图从用户读取数字,并希望将其存储为列表。例如:如果用户输入1 2 3 4 5,则列表将包含5个元素(1 2 3 4 5)。我试过(parse-integer(read-line) :junk-allowed t),但它只返回第一个元素。我该怎么做?感谢。

1 个答案:

答案 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)))))