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

问题描述 投票:12回答:6

在剪辑中,以下代码有效:

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

但是,在Clozure CL中,不支持shell功能!

shell exec common-lisp ccl
6个回答
10
投票

不,没有标准方法,但是有一些库为重要的实现提供了此功能。例如,Quicklisp中提供了一个琐碎的外壳,提供了shell-command。 (我实际上没有测试它,但是它在recommended librariesCLiki中。)还有一个外部程序。更新:[E0]似乎最近更喜欢inferior-shell,因为Ehvince在评论和他自己的答案中指出。

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

例如,CCL具有ccl:run-program

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

5
投票

是的,[DF]是ASDF的一部分,应包括在所有现代实现中。

  • 同步命令:UIOP
  • 异步命令:uiop:run-program

例如,]

uiop:launch-program

(uiop:run-program (list "firefox" "http:url") :output t)

您可以在其中发送输入和读取输出的位置。

这里有更多说明:[(defparameter *shell* (uiop:launch-program "bash" :input :stream :output :stream))

https://lispcookbook.github.io/cl-cookbook/os.html#running-external-programs已过时,并被trivial-shell取代,inferior-shell在内部使用便携式uioprun-program(同步),因此我们可以使用它。


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))
)

1
投票

下面显示了从通用Lisp中调用wget的示例:


1
投票

看看inferior-shell包装。


0
投票

CL21定义简单方法:

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