Существует ли стандартный способ запуска внешней программы в Common Lisp? - PullRequest
11 голосов
/ 11 октября 2011

В clisp работает следующий код:

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

Однако в Clozure CL функция shell не поддерживается!

Ответы [ 6 ]

10 голосов
/ 11 октября 2011

Нет, стандартного способа не существует, но есть библиотеки, которые предоставляют эту функциональность для важных реализаций.Например, в Quicklisp имеется тривиальная оболочка, которая обеспечивает shell-command.(Я на самом деле не тестировал его, но он входит в число рекомендуемых библиотек на CLiki .) Существует также внешняя программа.Обновление: подчиненная оболочка , кажется, предпочтительнее в наши дни, как указывает Эхвинс в комментарии и своем собственном ответе.

Вы также можете использовать условные выражения для чтения, чтобы различные реализации использовалисоответствующие функции для этого.

CCL имеет ccl:run-program, например:

CL-USER> (run-program "whoami" '() :output *standard-output*)
foobar
#<EXTERNAL-PROCESS (whoami)[NIL] (EXITED : 0) #xC695EA6>
3 голосов
/ 27 декабря 2016

(править 18 января). Более подробно здесь: https://lispcookbook.github.io/cl-cookbook/os.html#running-external-programs

trivial-shell устарел и заменен на inferior-shell , который внутренне использует переносной uiop run-program (синхронно), поэтому мы можем использовать только это. 1022 *

Асинхронные команды оболочки см. В uiop's launch-program.

2 голосов
/ 12 августа 2012
(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

1 голос
/ 29 апреля 2015

Посмотрите на пакет inferior-shell.

(получите через всемогущего quicklisp менеджера пакетов.)

Это работает в переводчике, если у вас есть интернет:

(require 'inferior-shell)
(inferior-shell:run/s '(curl icanhazip.com))
1 голос
/ 10 апреля 2014

Ниже приведен пример вызова wget из общего lisp:

https://diasp.eu/posts/1742240

Вот код:

(sb-ext:run-program "/usr/bin/wget" '("-O" "<path-to-output-file>" "<url-link>") :output *standard-output*) 
0 голосов
/ 23 июля 2017

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.

...