В clisp работает следующий код:
(defun hit-history () (shell "tail ssqHitNum.txt"))
Однако в Clozure CL функция shell
не поддерживается!
В clisp работает следующий код:
(defun hit-history () (shell "tail ssqHitNum.txt"))
Однако в Clozure CL функция shell
не поддерживается!
Нет, стандартного способа нет, но есть библиотеки, предоставляющие эту функциональность для важных реализаций. Например, в Quicklisp есть тривиальная оболочка, которая предоставляет shell-command
. (На самом деле я ее не тестировал, но она входит в число рекомендуемых библиотек на CLiki.) Также есть внешняя программа. Обновление: inferior-shell кажется предпочтительным в наши дни, как указывает Эвинс. в комментарии и его собственном ответе.
Вы также можете использовать условные выражения времени чтения, чтобы разные реализации использовали свои соответствующие функции для этого.
CCL имеет ccl:run-program
, например:
CL-USER> (run-program "whoami" '() :output *standard-output*)
foobar
#<EXTERNAL-PROCESS (whoami)[NIL] (EXITED : 0) #xC695EA6>
trivial-shell
. Кроме того, я не уверен в причинах предложения условных выражений времени чтения, поскольку это именно то, что делает тривиальная оболочка. (Вот почему такие библиотеки называются тривиальными-*.)
- person Ken; 17.10.2011
trivial-shell
устарел и заменен на inferior-shell, который просто использует uiop run-program
(синхронизация). Для асинхронности см. launch-program
uiop.
- person Ehvince; 27.12.2016
Да, с UIOP, который должен быть включен во все современные реализации.
uiop:run-program
uiop:launch-program
Так например
(uiop:run-program (list "firefox" "http:url") :output t)
or
(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, которая внутренне использует переносимый uiop run-program
(синхронно), поэтому мы можем использовать только это.
(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
(sb-ext:run-program "/usr/bin/dot" (list "-Tpng" "-O" fname)))
- person dpritch; 01.04.2018
Ниже показан пример вызова wget из common lisp:
https://diasp.eu/posts/1742240
Вот код:
(sb-ext:run-program "/usr/bin/wget" '("-O" "<path-to-output-file>" "<url-link>") :output *standard-output*)
Взгляните на пакет inferior-shell
.
(Получите его через всемогущего менеджера пакетов quicklisp
.)
Это работает в интерпретаторе, если у вас есть интернет:
(require 'inferior-shell)
(inferior-shell:run/s '(curl icanhazip.com))
CL21 определяет простые методы:
(in-package :cl21-user)
(use-package :cl21.process)
Затем либо с помощью run-process
, либо с помощью макроса чтения #`:
(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>
or
#`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.