将 Lisp 字符串转换为流

问题描述 投票:0回答:2

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

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 表达式)。

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

string lisp stream
2个回答
6
投票

您可以通过使用

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


0
投票

我必须使用

sb-ext:string-to-octects
,它允许我将外部格式指定为utf-8。我很惊讶,因为根据 https://www.sbcl.org/manual/#The-Default-External-Format 默认格式应该是 utf-8。我猜内部格式是iso-8859-1。

我最终得到了

(test base64-3
      (is (string= "YWJjZMKj" (cl-base64:usb8-array-to-base64-string
                               (sb-ext:string-to-octets "abcd£" :external-format :utf-8)))))
© www.soinside.com 2019 - 2024. All rights reserved.