相关疑难解决方法(0)

编写从命令行执行但不在解释器内执行的Common Lisp代码

在编写Common Lisp代码时,我使用SLIME.特别是,我使用CC Ck编译包含函数定义的缓冲区,然后切换到REPL以运行这些函数.将可执行代码放在缓冲区中运行这些函数似乎不能很好地工作.如果代码有错误,它可能会弄得一团糟.

有一种方法可以包含不在缓冲区中编译的代码,但是可以从命令行运行,例如在执行时

sbcl --script foo.lisp
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,每次我想从命令行运行代码时,我都不必继续添加和删除代码.是否存在这样的情况?

这类似于Python条件.

if __name__=='__main__':
Run Code Online (Sandbox Code Playgroud)

如果将Python文件作为模块导入,则为false;如果将其作为脚本运行,则为true.

这篇由Googling随机发现的题为"使用SBCL for Common Lisp shell脚本"的博文有

;; If run from command line, the following if-test will succeed

(if (> (length sb-ext:*posix-argv*) 1)

    ;; Code that is executed from the command line only goes here

)
Run Code Online (Sandbox Code Playgroud)

包含的代码确实不会被SLIME中的编译器运行,但它也不会被运行sbcl --script.

更新:感谢Vsevolod Dyomkin的有用答案和后续行动.关于该答案的一些注释如下,从对该答案的评论中汇编而成.@Vsevolod,如果你将这些添加到你的答案中,我会删除它们.

  1. 首先,我问了一种从命令行运行代码的方法,但不是从解释器运行代码.提供的解决方案做得更多; 它还提供了一种从解释器而不是命令行运行代码的方法.

  2. 第一步是为宏字符定义一个阅读器宏功能#!.如链接"在遇到宏字符时,Lisp读者调用其读取器宏函数"中所述.读者功能由调用来定义set-dispatch-macro-character.因此,当#!看到该字符时,set-dispatch-macro-character会导致调用正文中定义的lambda函数.然后,此函数将关键字添加:noscript*features*变量中.另请参阅讨论哪些读取器宏在SO问题中 有用.阅读宏:您使用它们是什么?.

  3. 观察到关键字:noscript*features*#!角色存在时精确添加的.此外,#! …

command-line sbcl common-lisp slime

10
推荐指数
2
解决办法
2313
查看次数

标签 统计

command-line ×1

common-lisp ×1

sbcl ×1

slime ×1