Common Lispの自作ユーティリティnths

Common Lispで複雑にネストされたリストから、深く埋め込まれた目的の要素を取り出すのに使うのに便利かなと思って書いてみた。

; 一つのリストに対してnthを複数回繰り返して要素を取り出す時に使う
;第1引数は対象リスト
;第2以下の引数はnthを使う場合に指定する第1引数(数値)を指定
(defun nths (lst1 &rest lst2)
  (labels ((rec (list1 list2)
                (if (null list2) 
                  list1
                  (rec (nth (car list2) list1) (cdr list2)))))
    (rec lst1 lst2)))

熟練者になるとこういうのを使わなくてもサッと取り出せるのかな・・・

drakmaのメモ

Common Lispのライブラリdrakmaを使っていて覚えた事、気を付けたい事をメモ。

drakmaで日本語文字(UTF-8)を扱うなら事前に以下を実行しておく
デフォルトはLatin-1のようです。

(setq drakma:*drakma-default-external-format* :utf-8)

サーバーとのやり取り(ヘッダー)を表示させたいなら以下を実行しておく

(setq *header-stream* *standard-output*) 

lispプログラムを簡単に起動して、簡単に終了させる

雨が降らないと地植えといえども水やりが必要になってくる植物があります。
そこで雨がどれくらい降っていないかをチェックするためにdrakma使ってプログラム - プログラムの事とかで紹介したプログラムをlispで作ってみました。

ただ寝ぼけている&忙しい朝、毎日のようにSBCLを立ち上げて、プログラムをロードして、実行・・・という作業は面倒です。
そこでダブルクリックで実行、結果を確認したらキーを押して終了という風にしてみました。

1.lispプログラムをEXEファイルに

SBCLを立ち上げて

load "プログラムのパス"(sb-ext:save-lisp-and-die "作成したい実行ファイルのパス" :toplevel 'プログラムのmain関数となる関数名 :executable t)

二つ目のコマンドは本来実行ファイルを作るものではないようで、できたファイルは巨大なものになっています。
ま、近頃のHDD環境を考えれば数十MBくらいで目くじら立てる事もないかな・・・ご愛嬌ですね。

2.batファイルで実行する

1.で作った実行ファイルを実行するとDOS窓がすぐに閉じてしまいます。
そこでバッチファイルから実行ファイルを起動させるようにします。

rem 雨の降っていない日をカウントするプログラムcount_fineday/lispを実行します
start /b "" "プログラムのパス" 
pause
exit

1行目 rem以下はコメントとして表示されます
2行目 startコマンドで実行ファイルを起動。/bで既存ウィンドウで起動。 ""パスに空白文字がある場合にはこのおまじないを入れておかないと上手くいかない。
3,4行目 pauseで結果表示を一旦止めて、何かキーを押せばexitで終了させる。

これでこのバッチファイルをダブルクリックで件のlispプログラム起動。
結果を確認したら、何かキーを押して窓を消すこともできて便利という結果に!

drakma使ってプログラム

drakmaの使い方をチョコッとだけ覚えたので、それを使ったプログラムを書いてみました。
読み込んで(count_fineday)を実行すると雨が降っていない日数を返します。
drakmaは気象庁のページに行ってページを持って来てくれています。
make_address関数内にあるアドレスにある数字を変えてやれば他の地域にも対応可。

その他にも色々と注意点はあるんですが・・・あんまり実用的なプログラムでもないでしょうから省きます。

あんまりライブラリを多用したくなかったので使わなかったのですが、CL-PPCREを使えばもっと楽にできたのかな。

続きを読む

Common Lispでのお助け変数達

Common Lispで使えるちょっと便利な変数達です。
CLHS: Section The Environment Dictionaryに記載されているのをguicho2.71828さんに教えて頂きました)

続きを読む

Closure HTMLの使い方メモ

Common LispのライブラリClosure HTMLを使ってみたので、簡単な使い方メモを書いておきます。
ちなみにClosure HTMLとはHTMLをlhtmlというS式に変換してくれるものです(その逆も可)。
(英語だけどClosure HTML Examplesにもっと詳しくく書いてあります)

htmlからlhtmlに

(chtml:parse "変換したいHTM"L (chtml:make-lhtml-builder))

"変換したいHTML"は文字列で指定

lhtmlからhtmlに

(chtml:serialize-lhtml "変換したいlhtml" (chtml:make-string-sink))

"変換したいlhtml"は文字列を指定

変換対象をファイルで指定したい場合

(chtml:parse #p"ファイルのパス" (chtml:make-lhtml-builder))

htmlの構文チェックし、おかしな箇所があれば修正する

(chtml:parse "チェックしたいhtml" (chtml:make-string-sink))

ドゥエルorシングル、画面選択はショートカットで

PCをガッツリ使う時はドゥエルディスプレイ環境、でもちょっとした調べものやだらだらネットサーフィンなんかの時はディスプレイ一つで充分!

そんな使い分けをしていますが、右クリックメニューから設定画面に行けるようになったWin7ですら面倒に感じてしまいます。

っでそんな時に重宝するのが「Win+p」のショートカット!