Lisp - 显示字符串到列表

Sea*_*ans 0 lisp string list common-lisp

我一直在寻找一种方法将用户输入(读取线)转换为我可以更容易操作的原子列表.例如:

SendInput()这是我的输入.希望这有效.

我想回来..(这是我的意见.希望这有效.)

最终删除任何句号,逗号,引号等是理想的.但是现在我只想将用户输入存储在列表中(不是作为一个字符串)

所以.现在我正在使用

(setf stuff (coerce (read-line) 'list))
Run Code Online (Sandbox Code Playgroud)

那个回到我身边......(#\ T#\ h#\ i#\ s#\ Space#\ i#\ s#\ Space#\ m#\ y#\ Space#\ i#\n#\##\u#\ t#.#\ Space#\ H#\ o#\ p#\ e#\ f#\ u#\ l#\ l#\ y#\ Space#\ t#\ h# \##\ s#\ Space#\ w#\ o#\ r ##\k#\ s#.)

所以现在我正在寻找一个可以获取该列表并正确格式化的功能...任何帮助将不胜感激!

Rai*_*wig 5

你想要做的是将一系列字符(一个字符串)拆分成一个较小的字符串或符号列表.

使用Lisp库中提供的一些拆分序列函数(请参阅cl-utilities).

在LispWorks中,它带有一个SPLIT-SEQUENCE函数)我会写例如:

CL-USER 8 > (mapcar #'intern
                    (split-sequence '(#\space #\.)
                                    "This is my input. Hopefully this works."
                                    :coalesce-separators t))
(|This| |is| |my| |input| |Hopefully| |this| |works|)
Run Code Online (Sandbox Code Playgroud)

请记住,要获得带有大小写保留名称的符号,它们会被垂直条包围.垂直条不是符号名称的一部分 - 就像双引号不是字符串的一部分 - 它们是分隔符.

你也可以打印它:

CL-USER 19 > (princ (mapcar #'intern
                            (split-sequence '(#\space #\.)
                                            "This is my input. Hopefully this works."
                                            :coalesce-separators t)))
(This is my input Hopefully this works)
(|This| |is| |my| |input| |Hopefully| |this| |works|)
Run Code Online (Sandbox Code Playgroud)

上面打印列表.第一个输出是打印的数据PRINC,第二个输出是由REPL完成的.

如果你不想要符号,而是字符串:

CL-USER 9 > (split-sequence '(#\space #\.)
                            "This is my input. Hopefully this works."
                            :coalesce-separators t)
("This" "is" "my" "input" "Hopefully" "this" "works")
Run Code Online (Sandbox Code Playgroud)


jwm*_*wmc 5

Rainer的答案更好,因为它更轻巧(和一般),但你也可以使用CL-PPCRE,如果你已经加载它(我知道我总是这样做).

您可以SPLIT直接在您获得的字符串上使用READ-LINE,如下所示:

(cl-ppcre:split "[ .]+" (read-line))
Run Code Online (Sandbox Code Playgroud)

(现在你有两个问题)