如何使用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))