如何在SEQUENCE中获取输入?

时间:2016-04-30 13:44:56

标签: lisp common-lisp sequence

我正在尝试用lisp语言编写排序代码。 但我不知道该怎么做。 我想使用序列使用lisp的sort函数。 我正在尝试创建这样的序列 -

(setq arr (make-sequence '(vector integer) 10   :initial-element (read)))
(terpri)
(write arr)

这会将初始元素设置为用户输入。但是我想从用户那里获取输入,我不知道该怎么做。任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:3)

您可以使用MAKE-ARRAY制作矢量。您可以将其fill-pointer设置为0,然后使用循环通过VECTOR-PUSH向其添加10个数字:

(let ((vec (make-array 10 :fill-pointer 0)))
  (dotimes (i 10 vec)
    (format *query-io* "Number ~d/10: " (1+ i))
    (finish-output *query-io*)
    (vector-push (parse-integer (read-line *query-io*)) vec)))

你也可以这样做:

(make-array 10 :initial-contents
            (loop
               for i from 1 to 10
               do (format *query-io* "Number ~d/10: " i)
               do (finish-output *query-io*)
               collecting (parse-integer (read-line *query-io*))))

但是这会为输入创建一个临时列表。

此外,正如Svante建议的那样,您可以使用MAP-INTO

;; If you don't want the number in the prompt, you can remove the LET
(let ((i 0))
  (map-into (make-array 10)
            (lambda () 
              (format *query-io* "Number ~d/10: " (incf i))
              (finish-output *query-io*)
              (parse-integer (read-line *query-io*)))))