2010年1月30日土曜日

Scheme コードバトンに参加

次回3月予定のShibuya.lispに向けて、現在面白げな企画が進行中です。

Shibuya.lisp に向けて Scheme コードバトンするのはどうか?
第1回 Scheme コードバトンのお知らせ - ひげぽん OSとか作っちゃうかMona-

;; ■ これは何か?
;; Scheme のコードをバトンのように回していき面白い物ができあがるのを楽しむ遊びです。
;; 次回 Shibuya.lisp で成果を発表します。
;; Scheme 初心者のコードを書くきっかけに、中級者には他人のコードを読む機会になればと思います。
;;
;; ■ 2 つのルール
;;
;; (1)自分がこれだと思える変更をコードに加えて2日以内に次の人にまわしてください。
;; 「人に優しい」変更なら何でも良い。1文字の変更でも可。
;; 「人に優しい」とは例えば、次の人が読みやすいコードを書くなど。
;; コードを削るのもあり。
;;
;; (2)次の人にまわしコードが変更されるのを"見守る"。
;; この説明書きを含めてバトンが伝わった事を必ず確認してください。
;; 止まっていたら助けてあげてください。

自分もg00001さんのバトンから派生したCL版を弄らせてもらいました。ライブラリまわりの導入に手間取ったのがちょっと痛かったかも…とりあえずテスタくらいの役割は果たせたんじゃないかと思います。

それと、newlispも一応lisp風スクリプト言語ということで大元となるhigeponさんのバトンからforkしてnewlisp版も作ってみることに。
こちらはCLやSchemeと違って正しいコーディングスタイルが分かってないので、つらつらと手の赴くままに。

動作例は以下

[~/code/newlisp]$ newlisp scheme_button.lsp http://gist.github.com/273424.txt # 辞書ファイルをURLから取得
allowance: 割当量 [y/n/q]? y
defect: 欠点 [y/n/q]? n
errand: 使いっ走り [y/n/q]? y
exploration: 探査、探検 [y/n/q]? y
heap: 積み重ねた物 [y/n/q]? y
;; saving dict...done
[~/code/newlisp]$ cat words.txt
(allowance "割当量" 1 0)
(defect "欠点" 0 1)
(errand "使いっ走り" 1 0)
(exploration "探査、探検" 1 0)
(heap "積み重ねた物" 1 0)

scheme版と同様にコマンドラインからの利用で、 newlispバイナリ一つあれば動作するようになっているとは思います。

CL版弄った時間もあわせると2日以上かかっていますがまあ気にしない。

2010年1月15日金曜日

今日の無題

小野和俊のブログ:成長しないプログラマーの7つの悪習慣

4つほど該当。

ただ、自分にとって不満な事柄を「人のせいにする」のではなく「自分のせいにして無限ループに陥る」ことも悪習慣の一つなんじゃないかな。。

今年は少しずつでいいから出来ることを噛み締めて形にしていこうと思います。

2010年1月7日木曜日

[xyzzy]分かったけど解決はしていない

xyzzyを初期化ファイルなし(xyzzy.exe -q)で起動するとメニューバーの [表示]->[ツールバー]部分が表示されない問題の原因が分かったのでメモ。

これはどうやらツールバーメニューの初期化を行う関数 (ed::load-command-bar-info) が *load-history-hook* から呼び出されていて、さらにこのフック変数を実行する関数 (load-history-file) が.xyzzyのロードと共に呼び出されている為に -q オプションを 指定して起動するとツールバーメニューが空になる現象が起こるらしい。

;; estartup.l:148:
(unless no-init-file
  (trap-errors
    (let ((*loading-user-initial-file* t))
      (load (namestring (if (file-system-supports-long-file-name-p "~/")
                            "~/.xyzzy" "~/_xyzzy"))
            :if-does-not-exist nil :verbose nil :print nil)))
  (unless *inhibit-history-load*
    (ignore-errors (load-history-file))))

[追記]

根本的な解決策ではないが、以下をsiteinit.lに入れてダンプファイル削除+再起動で直ったことにしておこう。

(defun load-command-bar-info-if-xyzzy-q ()
  (let ((cl (car si:*command-line-args*)))
    (when (or (equal cl "-q")
              (equal cl "-no-init-file"))
      (ed::load-command-bar-info))))
(add-hook '*pre-startup-hook* #'load-command-bar-info-if-xyzzy-q)