いわゆる Perl で言うところの、
 

 
# 外部コマンドの実行結果を
# 文字列で変数に代入
my $result = `ls -a`;
 

 
を CLISP でやろうと思って色々調べた結果をメモしておく(ちょっとハマった)。
 
環境は CLISP + Mac OS X 10.9
 

 
;; 補助関数
(defun copy-stream (in out)
 (loop for line = (read-line in nil nil)
  while line
  do (write-line line out)))
 
;; 本体
(defun cmd-output-to-string (cmd)
 (with-open-stream 
  (strm 
   ; shell や run-program cmd '(cmd-args) はうまくいかない
   (ext:run-shell-command cmd :output :stream))
  (with-output-to-string (out)
   (copy-stream strm out))))
 
;; 省略形
;; 且つ、文末の改行を削除(chomp)
(defun cmd (cmd)
 (string-right-trim '(#\newline) 
  (cmd-output-to-string cmd)))
 

 
参考:

 
構文はここで拾った。
running shell commands with gnu clisp – Stack Overflow
 
バグフィックスはこちらを参考にした。
家に帰ったらCommon Lispのコードを書いてみた。 – 週記くらい
 

 
 
 

§1596 · Posted By · 5月 11, 2014 · Development · Tags: , , , , , , · [Print]