如何解决只需执行一个 lsp 文件并获取一个日志文件
对于一个项目,我需要一个 Lisp 程序的输出,但是我以前从未听说过 Lisp,我无法让它运行。我已经从网站下载了文件 (.lsp) 并使用文本编辑器查看它以了解其逻辑。 lisp 文件获取某个输入并通过一些迭代步骤减少该输入。我不仅想知道输出,还想知道迭代过程,这就是为什么它的日志文件会很棒。我已经下载了 Portacle 和其他一些 Lisp 解释器/编译器,但我无法让它工作。这太令人沮丧了。有没有一种简单的方法可以从目录中运行 lisp 文件?我已经看过几个教程并阅读了这里的一些主题,但我仍然不知道如何像运行 Python 文件一样运行 Lisp 文件。
我非常感谢您的帮助!我很确定有一种我没有看到的简单方法。 在此先感谢您!
解决方法
如果您必须花一些时间在这上面,那么至少值得安装 Quicklisp 和 Slime,遵循本教程:
https://lisp-lang.org/learn/getting-started/
然而,您可以只从口译员开始。您需要安装 sbcl
,我建议您也安装 rlwrap
,因为 SBCL 提示没有花哨的阅读功能。
$ rlwrap sbcl
然后,您将进入 Lisp REPL。执行此操作以确保以最高级别的调试编译代码:
* (sb-ext:restrict-compiler-policy 'debug 3)
环境应该回复:
((DEBUG . 3))
NIL
然后,您可以编译您的输入文件(使用绝对路径,或相对于您启动 sbcl 的目录的路径):
* (compile-file "/tmp/concepts")
会发出很多文本,但解释器会回复生成的目标文件的名称(例如“/tmp/concepts.fasl”),您可以通过提供 *
作为参数来加载它,因为星号表示最后的结果。
* (load *)
按照文件中的注释(在#|
和|#
之间),您可以进行如下测试:
* (test-concepts shepard)
这会执行大量测试。
如果需要,您可以使用 (trace X Y Z)
跟踪单个函数,其中 X
、Y
和 Z
是函数名称(您也可以 untrace
它们)。
为简化起见,这里是一个列表,其中跟踪了评论中描述的所有(我认为)符号:
(trace frequency-of-properties
frequency-of-pairs
count-of-n
simplify-eight
remove-non-minimals
replace-lis-in-concept
print-linear-models
simplify-quads
make-master-list
make-pairs-for-quads
find-pair-quads
memberprop-lis
max-length
count-of-n
frequency-of-pairs
find-pairs-that-simplify
find-pair-to-simplify
remove-non-minimals
triples
three-pairs
simplify-by-mates
doubles
co
remove-non-minimals
replace-lis-in-concept
simplify-by-mates
singles
remove-non-minimals
replace-lis-in-concept
simplify-by-mates
print-linear-models
simplify-by-mates)
使用与上面相同的测试,最后一个测试打印以下跟踪:
Problem 6 0: (PRINT-LINEAR-MODELS (((A) (B) (- C)) ((A) (- B) (C)) ((- A) (B) (C)) ((- A) (- B) (- C))))
AB-C A-BC -ABC -A-B-C
0: PRINT-LINEAR-MODELS returned NIL
0: (FREQUENCY-OF-PROPERTIES (((A) (B) (- C)) ((A) (- B) (C)) ((- A) (B) (C)) ((- A) (- B) (- C))))
0: FREQUENCY-OF-PROPERTIES returned
((((A)) 2) (((B)) 2) (((- C)) 2) (((- B)) 2) (((C)) 2) (((- A)) 2))
0: (COUNT-OF-N ((((A)) 2) (((B)) 2) (((- C)) 2) (((- B)) 2) (((C)) 2) (((- A)) 2)) 4)
1: (COUNT-OF-N ((((B)) 2) (((- C)) 2) (((- B)) 2) (((C)) 2) (((- A)) 2)) 4)
2: (COUNT-OF-N ((((- C)) 2) (((- B)) 2) (((C)) 2) (((- A)) 2)) 4)
3: (COUNT-OF-N ((((- B)) 2) (((C)) 2) (((- A)) 2)) 4)
4: (COUNT-OF-N ((((C)) 2) (((- A)) 2)) 4)
5: (COUNT-OF-N ((((- A)) 2)) 4)
6: (COUNT-OF-N NIL 4)
6: COUNT-OF-N returned NIL
5: COUNT-OF-N returned NIL
4: COUNT-OF-N returned NIL
3: COUNT-OF-N returned NIL
2: COUNT-OF-N returned NIL
1: COUNT-OF-N returned NIL
0: COUNT-OF-N returned NIL
0: (SIMPLIFY-BY-MATES (((A) (B) (- C)) ((A) (- B) (C)) ((- A) (B) (C)) ((- A) (- B) (- C))))
1: (MAX-LENGTH (((A) (B) (- C)) ((A) (- B) (C)) ((- A) (B) (C)) ((- A) (- B) (- C))))
2: (MAX-LENGTH (((A) (- B) (C)) ((- A) (B) (C)) ((- A) (- B) (- C))) 3)
3: (MAX-LENGTH (((- A) (B) (C)) ((- A) (- B) (- C))) 3)
4: (MAX-LENGTH (((- A) (- B) (- C))) 3)
5: (MAX-LENGTH NIL 3)
5: MAX-LENGTH returned 3
4: MAX-LENGTH returned 3
3: MAX-LENGTH returned 3
2: MAX-LENGTH returned 3
1: MAX-LENGTH returned 3
0: SIMPLIFY-BY-MATES returned NIL
No simplification possible. Number of models 4
这应该可以更好地了解正在发生的事情。
您也可以使用 (step (test shepard))
,在这种情况下,调试器中的执行会中断;使用 help
获取有关您可以调用的命令的更多信息。例如,您可以编写 STEP
(或仅编写 S
)以进入一个表达式,NEXT
以跳过一个表达式并转到下一个表达式,OUT
以退出当前帧等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。