Haskell 的main
函数正是我想要的:评估文件何时自行加载(例如./myfile.hs
or runhaskell myfile.hs
)而不是其他情况。main
当文件被另一个文件导入时不会被调用。newLISP也有这个功能。
Common Lisp 有等效的代码吗?
我阅读了CLISP 的源代码。clisp myfile.lisp
以下是用户输入or时发生的情况./myfile.lisp
:
- CLISP 保存
myfile.lisp
为p->argv_execute_file
. - CLISP 创建表达式
(LOAD "p->argv_execute_file")
并将其压入 Lisp 堆栈。 - CLISP 将任何附加的命令行参数保存在一个列表中。
- CLISP 将参数存储在 Lisp 变量
*args*
中。
CLISP 从不生成引用 的 Lisp 变量p->argv_execute_file
,因此无法辨别myfile.lisp
是由 REPL 中的用户直接加载,还是由另一个 Lisp 文件加载。如果只是(car *args*)
,myfile.lisp
我的任务会很容易。
注意:如果文件是从 REPL 加载的,Shebangs 会给 CLISP 带来麻烦,所以我把这段代码放在~/.clisprc.lisp
:
(set-dispatch-macro-character #\# #\!
(lambda (stream character n)
(declare (ignore character n))
(read-line stream nil nil t)
nil))