CommonLisp (SBCL) で ningle を試してみる & 外部コマンドの実行

Commonlisp のお勉強。
今日はDockerコンテナ上で ningle を起動してみます。

前準備

docker run -d -p :22 -p :5000 moremagic/comon-lisp-study
apt-get update && apt-get install -y gcc


vi ningle.lisp

(ql:quickload :clack)
(ql:quickload :ningle)

(defvar *app* (make-instance 'ningle:<app>))

(setf (ningle:route *app* "/")
      "Welcome to ningle!")

(setf (ningle:route *app* "/login" :method :POST)
      #'(lambda (params)
          (if (authorize (cdr (assoc "username" params :test #'string=))
                         (cdr (assoc "password" params :test #'string=)))
              "Authorized!"
              "Failed...Try again.")))

(clack:clackup *app*)


起動

以下コマンドで 5000 でWebサーバがリッスンします。

sbcl --load ningel.lisp

終了するときは (exit) で抜けます。


外部コマンド
SBCLで外部コマンドの呼び出し はこうやるそうです

CL-USER(1): (sb-ext:run-program "/bin/date" nil :output t)
Sun Jul  3 03:38:58 UTC 2016

#<SB-IMPL::PROCESS :EXITED 0>

hello world にこれ入れてみてもダメだった。
さてどやるか調べてみようっと。



※追記
こうやるらしい

(with-output-to-string (out)
(sb-ext:run-program "/bin/ls" '("/") :output out))

fmfm なるほど!
関数化しておこう

(defun call-cmd (lat)
  (with-output-to-string (out)
    (sb-ext:run-program (car lat) (cdr lat) :output out)))

(call-cmd '("/bin/uname" "-a"))

"Linux b0f364e72845 3.19.0-37-generic #42-Ubuntu SMP Fri Nov 20 18:22:05 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
"


できた!

■参考
http://8arrow.org/ningle/
http://d.hatena.ne.jp/zalawcc/20090201/1233487237
http://lambdasakura.hatenablog.com/entry/20100115/1263786768