是否存在在Common Lisp中运行外部程序的标准方法?

时间:2011-10-11 03:24:19

标签: shell exec common-lisp ccl

在clisp中,以下代码有效:

(defun hit-history () (shell "tail ssqHitNum.txt"))

但是,在Clozure CL中,不支持shell函数!

6 个答案:

答案 0 :(得分:10)

不,没有标准方法,但有些库为重要的实现提供了这种功能。例如,Quicklisp中提供了一些简单的shell,它提供了shell-command。 (我实际上没有测试它,但它在recommended libraries上的CLiki中。)还有外部程序。更新:inferior-shell这些天似乎更受欢迎,正如Ehvince在评论和他自己的回答中指出的那样。

您还可以使用读取时间条件使不同的实现使用各自的功能来执行此操作。

CCL有ccl:run-program,例如:

CL-USER> (run-program "whoami" '() :output *standard-output*)
foobar
#<EXTERNAL-PROCESS (whoami)[NIL] (EXITED : 0) #xC695EA6>

答案 1 :(得分:3)

(编辑jan 18)这里有更多解释:https://lispcookbook.github.io/cl-cookbook/os.html#running-external-programs

trivial-shell已弃用并由inferior-shell取代,uiop内部使用便携式{{3}}的run-program(同步),因此我们可以使用它。

对于异步shell命令,请参阅uiop的launch-program

答案 2 :(得分:2)

(defun dot->png (fname thunk)
   (with-open-file (*standard-output*
       fname
       :direction :output
       :if-exists :superseded)
     (funcall thunk))
   (ccl:run-program "dot" (list "-Tpng -O" fname))
)

我在ccl(clozure)中取得成功,当时研究lisp p123的土地

答案 3 :(得分:1)

以下显示了从常见的lisp中调用wget的示例:

https://diasp.eu/posts/1742240

以下是代码:

(sb-ext:run-program "/usr/bin/wget" '("-O" "<path-to-output-file>" "<url-link>") :output *standard-output*) 

答案 4 :(得分:1)

查看inferior-shell包。

(通过全能的quicklisp包管理器获取。)

如果您有互联网,这可以在翻译中使用:

(require 'inferior-shell)
(inferior-shell:run/s '(curl icanhazip.com))

答案 5 :(得分:0)

CL21定义了简单的方法:

(in-package :cl21-user)
(use-package :cl21.process)

然后使用run-process或使用#` reader宏:

(run-process '("ls" "-l"))
;-> total 0
;   drwxrwxrwt    5 root         wheel   170 Nov  1 18:00 Shared
;   drwxr-xr-x+ 174 nitro_idiot  staff  5916 Mar  5 21:41 nitro_idiot
;=> #<PROCESS /bin/sh -c ls -l /Users (76468) EXITED 0>

#`ls -l /Users`
;=> "total 0
;   drwxrwxrwt    5 root         wheel   170 Nov  1 18:00 Shared
;   drwxr-xr-x+ 174 nitro_idiot  staff  5916 Mar  5 21:41 nitro_idiot
;   "
;   ""
;   0

该来源显示了SBCL和CCL的实施。