作为练习,我尝试使用 CL 按目录过滤 bash
locate
命令的输出(即仅列出属于目录的文件)。为此,我使用以下代码创建了一个名为 dirfilter.lisp
的文件:
#!/usr/bin/env -S sbcl --script
(let (line)
(loop while (setq line (read-line))
when (not (pathname-name (probe-file line)))
do (princ line) (terpri)))
按如下使用时效果很好
locate -i hello | ./dirfilter.lisp
。
但是,也只是作为练习,我通过删除 shebang 行,然后使用 SBCL repl 中的以下行创建了一个独立的可执行文件:
(load (compile-file "dirfilter.lisp"))
(save-lisp-and-die "dirfilter" :executable t)
但是现在,当尝试按如下方式使用独立可执行文件时
locate -i hello | ./dirfilter
我收到以下错误:
debugger invoked on a UNBOUND-VARIABLE @52BBE314 in thread
#<THREAD tid=203029 "main thread" RUNNING {1001448003}>:
The variable /HOME/DALANICOLAI/HELLO.PNG is unbound.
据我了解该错误,可执行文件中的读取行不会将输入读取为字符串,而是读取为符号。
这里发生了什么,如何解决?
你需要
toplevel
参数调用该函数 save-lisp-and-die
。参见手册。
如果不这样做,它所做的只是启动一个 REPL,然后尝试将路径名读取为符号,然后评估该符号。