Haskell 的main函数正是我想要的:评估文件何时自行加载(例如./myfile.hsor 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))