我一直在寻找一种方法将用户输入(读取线)转换为我可以更容易操作的原子列表。 例如:
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#。)
所以现在我正在寻找能够获取该列表并正确格式化的函数... 任何帮助将不胜感激!
答案 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))
(现在你有两个问题)