我正在编写一个程序,它打开一个 lisp 文件,在流上调用“读取”直到流为空,然后对它收集的列表进行操作。
在我发现“读取”将执行包查找之前,它工作得非常好,例如,如果它遇到 some-package:foo
它会提示 Package SOME-PACKAGE 不存在。
下面是一个例子来说明我的意思:
(read (make-string-input-stream "(list 'foo :foo some-package:foo)"))
所以我现在想要三件事中的一件:
- 让它“读取”将忽略包命名空间,这样我就可以将任意源文件转换为符号列表。
- 使用一些其他具有类似“读取”行为的解析库,但只能获取纯符号,方法是破坏
:
或忽略冒号及其之前的所有内容。 - 预处理文件并使用正则表达式等来打包查找并用普通名称替换它们,例如将“some-package:foo”转换为简单的“foo”
所有这一切的目的首先是制作一个函数调用依赖图。我知道存在质量更高的那种性质的东西,但我想自己做它来娱乐/学习。但是,我遇到了这个问题,不知道如何继续。
最佳答案
对于您的用例,您可以通过创建所需的包并重新启动来处理包错误情况。这也将保留符号身份。请注意,当您遇到 in-package
表单时,您需要对其进行处理。
关于list - 使用 "read"解析字符串并忽略包 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127961/