【问题标题】:Lisp - Displaying a String to ListLisp - 显示要列出的字符串
【发布时间】:2013-02-28 01:18:29
【问题描述】:

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

发送输入() 这是我的输入。希望这行得通。

我想回来.. (这是我的意见。希望这可行。)

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

所以。现在我正在使用

(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 #.)

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

【问题讨论】:

    标签: string list lisp common-lisp


    【解决方案1】:

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

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

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

    (现在你有两个问题)

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 对不起,我对 Lisp 不太熟悉。有没有办法删除这些分隔符?
      • @SeanEvans :使用PRINC 打印。
      • 我的意思是在列表本身中,您知道在将我的输入过滤到新列表后从元素中删除竖线的方法吗?
      • @Sean Evans:列表中没有竖线。它们仅在印刷表示中。您可以打印或不打印。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多