【问题标题】:LISP: Help reading input stream (with spaces) into a list of charactersLISP:帮助将输入流(带空格)读入字符列表
【发布时间】:2011-03-21 19:05:39
【问题描述】:

我正在尝试编写一个程序,在该程序中我需要逐个字符地处理字符串,包括空格。该字符串将由运行程序的用户从标准输入流中给出。

我注意到(read) 函数仅在捕获了一些非空白字符后才停止,并切断从第一个空白字符开始的所有内容。

换句话说,如果我执行(read) 函数并输入hi to you,它将返回HI。我希望我的函数返回的是(#\h #\i #\Space #\t #\o #\Space #\y #\o #\u)。谁能给我一些关于如何做到这一点的指示?抱歉,我对 LISP 很陌生,但我非常喜欢它。

编辑:我尝试过的一件事是将 (cons) 与 (read-char) 一起使用。例如:(cons (read-char) (cons (read-char) (cons (read-char) (cons (read-char) (read-char)))))。当用户输入“hello”时,这会输出(#\h #\e #\l #\l . #\o),这很接近,但是那个额外的时间在那里做什么?

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    Xach 基本上回答了您的主要问题:您可能想阅读带有read-line 的行并将其强制到一个列表中:(coerce (read-line) 'list),然后对这个列表执行一些操作。

    read不起作用的原因是它读取并返回s-expressions:

    > (car (read))
    (foo bar baz) ; this is me typing
    
    FOO
    

    所以它只是读取输入“hi to you”中的第一个符号hi 并停止。连续调用 read 将返回其余部分:

    > (list (read) (read) (read))
    hi to you ; me typing again
    
    (HI TO YOU)
    

    您可能仍想使用 Xach 的建议来获取您的意见。

    为了解决您的另一个问题,该字符列表中有一个点的原因是表达式 (cons (read-char) (cons (read-char) (cons (read-char) (cons (read-char) (read-char)))))(cons (read-char) (read-char)) 结尾,它将两个字符组合在一起。

    Cons 创建“cons 单元格”或 Lisp 对,以点对表示:

    > (cons 'a 'b)
    (A . B)
    

    Lisp 列表通常由nil 或空列表作为最后一个元素组成。但它们实际上表示为带有这些 cons 单元格的链表,它们是相同的:

    (a . (b . (c . ())))
    
    (a b c)
    

    它们通常只是以第二种方式打印。在您的情况下,最后一个元素是一个字符,因此它被打印为一个点尾列表。在 REPL 上进行试验,这将是有意义的:

    > '(a . (b . c))
    (A B . C)
    
    > '(a b . c)
    (A B . C)
    
    > '(a b c)
    (A B C)
    
    > '(a . (b . (c . nil)))
    (A B C)
    

    所以你想用这个原始表达式做的是:

    > (cons (read-char) (cons (read-char) (cons (read-char) (cons (read-char) (cons (read-char) nil)))))
    (#\h #\e #\l #\l #\o)
    

    【讨论】:

      【解决方案2】:

      read-char 将返回下一个可用字符,read-line 将整个输入行作为字符串返回。您可以使用coerce 将字符串更改为字符列表,例如

      (coerce "foo" 'list) => (#\f #\o #\o)
      

      【讨论】:

      • 这是完美的。非常感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      相关资源
      最近更新 更多