苦労じゃー
以前ちょっと書いた、100金の野菜売り場にまた行ってしまった(と言うか足ッシー君を させられたんだけど)。
もう終わりだと思っていた枝豆がしつこくまだ出ていた。女房にはゴミが出るからと嫌われたけど 3袋買ったよ。毎日食べても1週間ぐらいは持つな。病み付きになりますよ。
ナイロン袋を膨らませた中に、バジルの葉が入っていた。今日の昼は、バジルのスパゲッティーに でもしますかねーで、Get。帰りにバジルのソースを買うってどういう事? バジルの葉は薬味の ようにスパゲッティーの上に乗っ取りました。紫蘇の葉の代わりにバジルなんだな、納得。
でも、一杯あって使い切れるものでもありません。バジルのソースの成分欄を見てた女房。これ なら、自家製のバジルソースが出来るわよ、ですって。基本的に、葉とオリーブオイルが有れば いいらしい。後は塩を適量。お好みで砂糖とレモンとかチーズを入れるらしい。
早速バジルの葉を細かくする。普通はフードプロセッサーを使うらしいんだけど、おいらの所には リストプロセッサー(Lisp)しか無いからなあなんて思っていたら、粉茶を作る時に使った粉砕機を 持ち出してきましたよ。発想の転換だな。
箸で葉を押さえながら微塵切りされた所で、オリーブオイルと塩を入れて出来上がり。ニンジンや 大根のサラダにかけて美味しく頂きましたよ。変な市販のドレッシングよりもおいら的には性に あってたな。女房は納豆と一緒に食べてたぞ。バジルを紫蘇の葉と思えばいいんか。
別の日に100均へ行ったら、イチジクが売られていた。無花果ってイチジク浣腸を連想して しまい、この歳まで食べた事無かったんだ。女房曰く、浣腸剤の容器がイチジクに似てるから命名したと 言うんだけど、本当かなあ?
で、食べてみた。甘いね。こういう果物もあるんだね。何と似てるって言われても、例えようが 無いな。また食べてみたいと言う程では無かったよ。
で、たまたま読んでいた小沢昭一さんの本の中に、旅の途中でイチジクのブドウ酒煮に感動する 話が出てきた。旨いらしい。そうなると、やってみたいね。調べてみた。 イチジクのブドウ酒煮とか いちじくの赤ワイン煮(コンポート)みたいに 作るようだ。ちょいと高級デザートだな。作ってみますかね。
Sharpsign
前回、ネットに共通リスプのリーダーマクロ一覧が見つからないと嘆いた。たまたま掲示板を 見てたら、slimeの便利コマンドで、C-c C-d # なんてのが紹介されてた。その情報元は Hyperspecと言うお粗末。灯台本暗し。
このコマンドを実行すると、mini-bufferに 何探すなんて質問が出てきた。取りあえず、知ってる 所で、ドットを入力すると、ドッとブラウザーが出てきたよ。
2.4.8 Sharpsign Sharpsign is a non-terminating dispatching macro character. It reads an optional sequence of digits and then one more character, and uses that character to select a function to run as a reader macro function. : 2.4.8.1 Sharpsign Backslash : 2.4.8.22 Sharpsign Right-Parenthesis
こんな具合に列挙されてました。上位概念は、シンタックスの項の標準マクロ文字の部です。
今まで、随分maximaで引っ張ってきたけど、そろそろ目先を変えてみるかな。
clojure 1.3.0
clojure 1.3がリリースされた。おいらは1.0の頃ちょっと触っただけなので 久しぶりって感じだ。だって、Lisp族にはいろいろあって中々全部均等にとはいかないからだ。 Lisp族のまとめは、 Lisp: Common Lisp, Scheme, Clojure, Emacs Lisp って事で載ってるよ。あれ? あの人の作ったArcは出てないけど、どうしちゃったのかな。
clojureするならshiroさんが訳した黒猫本が日本語で読める唯一の本だけど、英語なら clojure wikiあたりを基点にすると いいのなか。それとも、 Clojure - Functional Programming for the JVM がいいかな。掲示板もあるよ。 それから、逆引きClojure:なんてのもあるぞ。
本家のページから辿った所にも Getting Started なんてのがある。委員会Lispと違って、長い名前を付ける習慣が無いんで、英語(の綴り)恐怖症は 大分薄れるんだけど、やっぱり開発環境は使い慣れたemacsの上が楽でいいな。
おまけで、委員会Lispからclojureへの移行 とか、これとか。
Slime for clojure
で、どうやってセットアップするんだったっけ? ぐぐってみたら、 Ubuntu 10.04 での Clojure + Emacs + Leiningen の環境構築 とか SLIMEでClojureを使う なんてのがヒットしてきたけど、Windows上で使う人は余りいないようで、参考にならなかった。 (ごめんなさいです)
そんでもって、何はなくとも江戸紫じゃなくて、 clojure-modeだろうと思って、行ってみたんだ。そしたら 一番楽な方法ってのが出ていた。苦労じゃモードを取ってこいとな。emacsの上のパッケージ システムを使えば楽って事みたいだけど、gemにしろasdfにしろ、閉じたやつはおいら的には 嫌いなんだな。
苦労じゃモードを取ってくるににgitがあればいいんか。この際だからWindows用のgitも 用意してみっかな。
git for Windows
探したよ。そしたら、 git for Windowsなんてのが引っかかってきた。このシステムを 入れると、unixっぽいコマンドもダーと入るようなので、入れてみたよ。そしたら、vimも つられて入ってきた。これは一石二鳥ですだ。
Windowsの糞端末からvimとかを使う場合は、PATHを通しておく。何時も設定の仕方を忘れて しまうので、メモ。
コンパネ開いて、システムとセキュリティーを叩いて、システムをクリック。左側のペインにある システムの詳細設定をクリックして詳細設定のタブを出すと、やっと環境変数のボタンが出てくる。 Windowsのいじわる度が分かろうと言うものです。
lein
clojureでの開発は、leinにお任せみたいなので、入れておく。 PATH通して奥んだぞ。設定はWindowsのいじわるにより奥にあるからな!
swankと言う、clojureのランチャーであるプラグインを入れる
c:\>lein plugin help Manage user-level plugins. Subtasks available: install Download, package, and install plugin jarfile into ~/.lein/plugins Syntax: lein plugin install [GROUP/]ARTIFACT-ID VERSION You can use the same syntax here as when listing Leiningen dependencies. uninstall Delete the plugin jarfile Syntax: lein plugin uninstall [GROUP/]ARTIFACT-ID VERSION Arguments: ([subtask project-name version]) c:\>lein plugin install swank-clojure 1.3.3 Installing shell wrapper to C:\Users\sakae\.lein\bin\swank-clojure Installing shell wrapper to C:\Users\sakae\.lein\bin\swank-clojure.bat Copying 1 file to C:\Users\sakae\AppData\Local\Temp\lein-d6fe9e7e-a414-4902-b0f3-cdab523346be\lib Including swank-clojure-1.3.3.jar Including clojure-1.2.1.jar Created swank-clojure-1.3.3.jar
後は適当に leinの翻訳記事 でも読みながら、プロジェクトを作る。それから、lein depsしておく。 続いてemacsから
M-x clojure-jack-in
面倒なら、.emacsにでも
(defun clj () (interactive) (require 'clojure-mode) (setq slime-net-coding-system 'utf-8-unix) (clojure-jack-in))
書いておいて、M-x clj すれば良い。そうすると、emacsから、プロジェクトのdirを聞いて 来るので、場所を指示。暫くするとreplが上がって来る。プロジェクトの苦労じゃバージョンを 1.2.1とか1.3.0とかに指定して作っておくと、簡単にバージョンを切り替えられて便利。
FreeBSDでは、何故かjack-inが出来なかったので、ちょっと手間かけて起動してる。
[sakae@cdr ~/CLJ/c130]$ lein swank Connection opened on localhost port 4005.
こうして、clojureを起動しておいてから、emacs上で slime-connectしてる。
共通Lispとどのぐらい似てる?
こうして環境が整った。clojureって共通Lispとどれぐらい似てるんだろう? まずは、ドキュメントの 参照だな。
user> (clojure-version) "1.3.0" user> (use 'clojure.repl) nil user> (doc doc) ------------------------- clojure.repl/doc ([name]) Macro Prints documentation for a var or special form given its name nil
何故か、1.3.0の場合は、clojure.replをuseしておかないと、docが使えなかったよ。change.txt を読んだら、そっちに移ったんだってさ。ネットに繋がっているなら、 こちらの方が全体に俯瞰出来て便利だろう。
user> (find-doc "ns-") ------------------------- clojure.main/main ([& args]) Usage: java -cp clojure.jar clojure.main [init-opt*] [main-opt] [arg*] With no options or args, runs an interactive Read-Eval-Print Loop init options: -i, --init path Load a file or resource -e, --eval string Evaluate expressions in string; print non-nil values main options: -m, --main ns-name Call the -main function from a namespace with args -r, --repl Run a repl path Run a script from from a file or resource - Run a script from standard input -h, -?, --help Print this help message and exit : ------------------------- clojure.core/ns-map ([ns]) Returns a map of all the mappings for the namespace. :
find-docってコマンドは黒猫本に出てたなあ。
user> (use 'clojure.pprint) nil user> (pprint (apropos "debug")) (toggle-debug-on-swank-error debugger-info-for-emacs debug-swank-clojure debug-abort-exception debug-quit-exception debug-continue-exception invoke-debugger debugger-condition-for-emacs sldb-debug build-debugger-info-for-emacs) nil
find-docと似たようなの、やっぱり有った。
どんなモジュールが有るかは
user> (ns-map *ns*) {sorted-map #'clojure.core/sorted-map, read-line #'clojure.core/read-line, : meta #'clojure.core/meta}
んでもって、ソースも見れるよ。
user> (source source) (defmacro source "Prints the source code for the given symbol, if it can find it. This requires that the symbol resolve to a Var defined in a namespace for which the .clj is in the classpath. Example: (source filter)" [n] `(println (or (source-fn '~n) (str "Source not found")))) user> (source source-fn) (defn source-fn "Returns a string of the source code for the given symbol, if it can find it. This requires that the symbol resolve to a Var defined in a namespace for which the .clj is in the classpath. Returns nil if it can't find the source. For most REPL usage, 'source' is more convenient. Example: (source-fn 'filter)" [x] (when-let [v (resolve x)] (when-let [filepath (:file (meta v))] (when-let [strm (.getResourceAsStream (RT/baseLoader) filepath)] (with-open [rdr (LineNumberReader. (InputStreamReader. strm))] (dotimes [_ (dec (:line (meta v)))] (.readLine rdr)) (let [text (StringBuilder.) pbr (proxy [PushbackReader] [rdr] (read [] (let [i (proxy-super read)] (.append text (char i)) i)))] (read (PushbackReader. pbr)) (str text)))))))
seesawとか
shiroさんのブログを読んでいたら、 よりClojureらしい素数列 - OGINO Masanori@はてな なんてのが取り上げられていて、その続きで 水底で思うこととか言うリンクも 掲載されてた。とことん追求する人だなあ。さすが日本を代表するHackerだ事。
それはそれとして、上記関連でIEしてたら、 clojureプログラミング入門-37 seesawでswingプログラミング と言うエントリーが引っかかってきた。(どこをどうほっつき歩いたかは、今となっては不明)
daveray / seesaw が、発信地。 swingを知らない人でも、手軽にGUIが作れるらしい。
(ns hello-seesaw.core (:use seesaw.core)) (defn -main [& args] (invoke-later (-> (frame :title "Hello", :content "Hello, Seesaw", :on-close :exit) pack! show!)))
右矢印 (->)って、何物ぞ。まずはそのあたりからだな。