将 lisp 字符串转换为流

Posted

技术标签:

【中文标题】将 lisp 字符串转换为流【英文标题】:Convert a lisp string to stream 【发布时间】:2010-12-03 14:44:56 【问题描述】:

我有一个如下所示的文件:

A B C D E
0 8 6 12 5
8 0 10 8 9
6 10 0 7 11
12 8 7 0 6
5 9 11 6 0

我不知道会有多少行和列。我想阅读第一行,它会让我知道期望的行数。我发现了 lisp 的 (read <stream>) 函数,它在一个循环中可以将每个字符解析为符号。但是,我还没有找到将循环限制为仅读取第一行并停在那里的方法。我正在尝试解决的解决方案类似于

(with-open-file (stream "/home/doppler/tmp/testcase1.txt")
  (setf line (read-line stream))
  (when line
    (loop for symbol = (read line nil)
         while symbol do (print symbol))))

问题在于(read-line stream) 返回一个字符串,(read line nil) 无法解析该字符串以提取符号(s 表达式)。

如何将字符串行转换为流,或者如果可能的话,直接从字符串中提取符号?

【问题讨论】:

make-string-input-stream 【参考方案1】:

您可以使用with-input-from-string 宏将字符串用作流,也可以在循环中使用read-from-string。您可能还对read-delimited-list 函数感兴趣,尽管在使用它之前您必须在字符串末尾添加某种分隔符。

【讨论】:

我最终使用了从字符串读取。 read-delimited-list 函数看起来很有用,但我还没有完全习惯阅读 LISP 文档,所以我不太确定如何使用它。谢谢!

以上是关于将 lisp 字符串转换为流的主要内容,如果未能解决你的问题,请参考以下文章

如何将 for 循环转换为流

如何将字符串转换为符号以用作 Lisp“assoc”函数中的键?

将值从字符串转换为流时出错

在 Common Lisp 中将 FUNCTION 转换为 STRING 或 SYMBOL

将 XDocument 转换为流

将字节数组转换为流