为什么 read-line 读取 sbcl 编译的可执行文件中的符号(而不是字符串)?

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

作为练习,我尝试使用 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.

据我了解该错误,可执行文件中的读取行不会将输入读取为字符串,而是读取为符号。

这里发生了什么,如何解决?

common-lisp sbcl
1个回答
0
投票

你需要

  • 定义一个函数作为你的程序,
  • 并告诉 SBCL 在重启时使用
    toplevel
    参数调用该函数
    save-lisp-and-die

参见手册

如果不这样做,它所做的只是启动一个 REPL,然后尝试将路径名读取为符号,然后评估该符号。

© www.soinside.com 2019 - 2024. All rights reserved.