Memoize

BasicWerk   EC Support   Technique   Facebook  

20140607181635_sb-ext_run-program

sb-ext_run-program

 

 

SBCL の sb-ext:run-program で外部コマンドを実行したときに、外部プログラムが吐いた標準出力を文字列として受け取る。

 

例:

 
;; 文字列ストリームに :output を向ける
* (defparameter strm (make-string-output-stream))
* (sb-ext:run-program "date" nil :search t :output strm)
* (get-output-stream-string strm)
;; ->
;;	"2014年 6月 7日 土曜日 18時06分42秒 JST
;;	"
 

 

いちいち全部書くのは面倒なので関数にまとめる。

 

 
(defun trim (str)
 (string-trim '(#\Space #\newline #\tab) str))
 
(defun cmd (prgrm args &key (get-string t) (trim t))
 (if get-string
  (let ((strm (make-string-output-stream)))
   (sb-ext:run-program prgrm args :search t :output strm)
   (let ((out (get-output-stream-string strm)))
    (if trim
     (trim out)
     out)))
  (sb-ext:run-program prgrm args :search t :output t)))
 
* (cmd "date" nil)
 
;; -> "2014年 6月 7日 土曜日 18時10分33秒 JST"
 

 

 

  1. args には引数のリストを渡す。引数なしは nil
  2. コマンドの出力から最後の改行を取り除くために trim

 


© Shin Nakamura/BasicWerk 2014