これはシステムに依存するため、必要なさまざまなシステムコール用の組み込みラッパーがない言語がたくさんあります。
たとえば、CommonLisp自体は特定のシステムで実行するようには設計されていません。ただし、SBCL(Steel Banks Common Lisp実装)は、他のほとんどのCL実装と同様に、Unixライクなシステムの拡張機能を提供します。もちろん、これは単に出力を取得するよりもはるかに「強力」です(実行中のプロセスを制御でき、あらゆる種類のストリーム方向を指定できます。SBCLマニュアルの6.3章を参照してください)が、簡単に実行できます。この特定の目的のために小さなマクロを書いてください:
(defmacro with-input-from-command((stream-name command args)&body body)
"コマンドの出力ストリームをstream-nameにバインドしてから、本文を実行します
暗黙の予測で。」
`(with-open-stream
(、ストリーム名
(sb-ext:process-output(sb-ext:run-program、command
、args
:検索t
:output:stream)))
、@体))
これで、次のように使用できます。
(with-input-from-command(ls "ls"'( "-l"))
;;lsストリームで派手なことをする
)。
おそらく、すべてを1つの文字列にまとめたいと思うでしょう。マクロは簡単です(おそらくもっと簡潔なコードが可能ですが):
(defmacro syslurp(コマンド引数)
"コマンドからの出力を文字列として返します。コマンドが提供されます
文字列として、文字列のリストとしてargs。」
(let((istream(gensym))
(ostream(gensym))
(line(gensym)))
`(with-input-from-command(、istream、command、args)
(with-output-to-string(、ostream)
(loop(let((、line(read-line、istream nil)))
(when(null、line)(return))
(write-line、line、ostream))))))))
これで、次の呼び出しで文字列を取得できます。
(syslurp "ls"'( "-l"))