如何将字符串"1 2 3 4 5 6 7"
优雅地转换为列表(1 2 3 4 5 6 7)
?我正在使用CLISP。
答案 0 :(得分:3)
您应该在循环中使用parse-integer
。
例如,使用loop
:
(let ((string "1 2 3"))
(loop :for (integer position) := (multiple-value-list
(parse-integer string
:start (or position 0)
:junk-allowed t))
:while integer
:collect integer))
⇒(1 2 3)
如果您需要更好地控制拆分,请使用split-sequence
或cl-ppcre
库。
如果您需要解析更多通用数字格式,请使用parse-number
库。
可以从Quicklisp获得库。
答案 1 :(得分:2)
提示:看看with-input-from-string。
答案 2 :(得分:2)
(with-input-from-string (s "1 2 3 4 5 6 7" :index i :start 0 :end 13)
(list (read s) (read s) (read s) (read s) (read s) (read s)))
(1 2 3 4 5 6 7)
它有效但我觉得它不是那么优雅,因为有许多read
电话。
再次感谢!
答案 3 :(得分:2)
这是一个递归解决方案。
;Turns a string into a stream so it can be read into a list
(defun string-to-list (str)
(if (not (streamp str))
(string-to-list (make-string-input-stream str))
(if (listen str)
(cons (read str) (string-to-list str))
nil)))
答案 4 :(得分:1)
我看到斯万特是对的。我之前的尝试没有奏效。这是另一种尝试。我使用concatenate将字符串更改为列表表示形式。然后我使用read-from-string将字符串(s-2)转换为实际列表。
(setf s-0 "1 2 3 4 5 6 7")
(setf s-1 (concatenate 'string "(" s ")" ))
(setf s-2 (read-from-string s-1))
我把它变成这样的函数:
(defun from-string-to-list (s)
(let ((L (read-from-string
(concatenate 'string "(" s ")"))))
L))
"让"的唯一目的和" L"是使函数from-string-to-list仅返回列表而不返回多个值。 read-from-string返回两个值:我认为列表和字符串的大小。
答案 5 :(得分:0)
那样做,
(with-input-from-string (s "1 2 3 4 5")
(let ((r nil))
(do ((line (read s nil 'eof)
(read s nil 'eof)))
((eql line 'eof))
(push line r))
(reverse r)))
答案 6 :(得分:0)
我认为这可行:
(setf s "1 2 3 4 5 6 7")
(setf L-temp (coerce s 'list))
这会生成一个以空格为元素的列表。删除空格:
(setf L-final (remove #\Space L-temp))