Lisp - 显示字符串到列表

时间:2013-02-28 01:18:30

标签: string list lisp common-lisp

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

  

SendInput()   这是我的意见。希望这有效。

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

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

因此。现在我正在使用

(setf stuff (coerce (read-line) 'list))

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

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

2 个答案:

答案 0 :(得分: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|)

请记住,要获取包含大小写保留名称的符号,它们会被竖线包围。垂直条不是符号名称的一部分 - 就像双引号不是字符串的一部分一样 - 它们是分隔符。

您也可以打印它:

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|)

以上打印列表。第一个输出是由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")

答案 1 :(得分:5)

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

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

(cl-ppcre:split "[ .]+" (read-line))

(现在你有两个问题)