0

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

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 #\空格 #\w #\o #\r #\k #\s #.)

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

4

2 回答 2

5

Rainer's answer is better in that it's a bit more lightweight (and general), but you could also use CL-PPCRE , if you already have it loaded (I know I always do).

You can use SPLIT directly on the string you get from READ-LINE, like so:

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

(Now you have two problems)

于 2013-02-28T10:52:30.943 回答
5

您要做的是将一个字符序列(一个字符串)拆分为一个较小的字符串或符号列表。

使用 Lisp 库中提供的一些拆分序列函数(参见例如cl-utilities)。

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

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

上面打印列表。第一个输出是由 REPL 打印的数据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")
于 2013-02-28T01:53:27.800 回答