如何使用clisp将字符串转换为列表?
如何将字符串如何使用clisp将字符串转换为列表?,lisp,common-lisp,Lisp,Common Lisp,如何将字符串“1 2 3 4 5 6 7”优雅地转换为列表(1 2 3 4 5 6 7)?我正在使用CLISP。提示:请查看 它可以工作,但是我觉得它没有那么优雅,因为有很多readcall 再次感谢 您应该在循环中使用 例如,使用循环: (let ((string "1 2 3")) (loop :for (integer position) := (multiple-value-list (parse-intege
“1 2 3 4 5 6 7”
优雅地转换为列表(1 2 3 4 5 6 7)
?我正在使用CLISP。提示:请查看
它可以工作,但是我觉得它没有那么优雅,因为有很多read
call
再次感谢 您应该在循环中使用
例如,使用循环:
(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获得。这里是一个递归解决方案
;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)))
那就行了
(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)))
我认为这可能有效:
(setf s "1 2 3 4 5 6 7")
(setf L-temp (coerce s 'list))
这将生成一个以空格作为元素的列表。删除空格:
(setf L-final (remove #\Space L-temp))
我看斯万特是对的。我以前的尝试没有成功。这是另一种尝试。我使用concatenate将字符串更改为列表表示形式。然后我使用readfromstring将字符串(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))
“let”和“L”的唯一用途是使从字符串到列表的函数只返回列表,而不返回多个值。readfromstring返回两个值:列表和字符串的大小。那么,您到底想做什么?“字符串到列表”对我来说意味着从一个字符串到一个字符列表,但你的例子是读取由空格分隔的内容。我是一个lisp新手。我还没有找到像“分裂”这样的功能。到目前为止,我可以使用“parse integer”将“123”转换为123。使用cl-ppcre:(mapcar#parse-integer(ppcre:split#\space“1 2 3”)
(使用字符串(s“1 2 3 4 5 6 7”)的输入)(x的循环=(读取s nil:end)直到(eq x:end)collect x))
应该可以工作,但请注意它需要“1 2 3”
到符号列表而不是字符串列表。此外,在上面的表单中,在第一个列表中,您可以将字符串(此处为“1 2 3 4 5”
)替换为类似(读取行流)
,从流中读取行,但不生成字符串而是列表。这将生成列表(#35; 1#2#3#3#5#6#7)
,我E数字字符的列表。旁白:不要设置不存在的变量。我认为Svante是正确的。我再试了一次,然后用readfromstring发布了答案。我还在开始学Lisp。所以,我对“不存在的setf变量”感到好奇。这是否违反了功能性风格?或者这会使我的代码在大型程序中更加混乱吗?不,这只是未定义的行为。您正在隐式创建一个全局变量,该变量可能是特殊的,也可能不是特殊的(动态的)。使用defparameter
或defvar
创建新的全局特殊变量,或使用let
(或其他引入局部作用域的构造)创建局部变量。非常感谢您的解释,Svante。非常感谢。
(defun from-string-to-list (s)
(let ((L (read-from-string
(concatenate 'string "(" s ")"))))
L))