dyncomp 0.1リリース

Gaucheの拡張モジュールdyncompをリリースしました。このライブラリを使うと、Gaucheのコードの中でCの関数が定義できるようになります(PerlのInline::Cみたいなモジュールです)。

メリットとして、以下のものがあります。

  • Schemeのコードの中に埋め込めるのでメンテナンスが簡単
  • コンパイラとしてTiny C Compilerを使っているのでコンパイル速度も速い
  • Cといってもgauche.cgen.ciseを使ったS式表現なので、C風の構文アレルギーの方でも安心して使える

デメリットとしては、以下のものがあります。

  • 現状Linuxでしか動かない*1
  • 読めないヘッダファイルがある(GCCの機能に依存しているものとか)
  • 構文がSchemeに似ているのでコードを書いていると混乱する

以下はマンデルブロ集合の計算でベンチマークをとった結果です (CPUはPentiumM 2.13GHz)。こういったように、ものによっては数十倍速くなります。

# Schemeバージョンの計算時間
% gosh examples/mandelbrot.scm
;(time (fill-image image size))
; real   1.190
; user   1.180
; sys    0.010

# dyncomp使用時の計算時間
% gosh examples/mandelbrot.scm -c
;(time (fill-image-fast image size))
; real   0.025
; user   0.020
; sys    0.000

雰囲気として、「"特殊なLisp"で書くと自動的に速くなる」といった感じでコンパイルとか気にせず使えますので、気軽にお試しください。

*1:MacOSX, FreeBSD, Windowsでも動作するようになりました

動的型の言語でも以下のようなプログラムの問題を検出できます

Matzにっき(2008-02-19)にあったプログラムくらいなら、一応glintでも問題を検出できます。

(define (test a b)
  (print (+ a b)))

(define (main args)
  (if (< 3 (length args))
      (test 1 test)
      (test 1 2))
  0)
% glint hidden_dangers.scm
hidden_dangers.scm:2: error: # can't be applied with arguments (1 #)

エラー箇所がちょっと分かりにくいのが難点。

もちろん、以下のようなobject-+の定義を追加してあげればエラーは消えます(ただし、交換則が成立しないので、実際に使うのはさけた方がいいですけど)。

(define-method object-+ ((a <integer>) (b <procedure>))
  a)

gauche.night

去年に引き続き、3/8に行われたgauche.nightに参加してきました。スタッフ、参加者の皆様方お疲れさまでした。

今回もgauche.gongで発表させていただきましたが、発表した内容をニコニコ動画にアップロードしました。
D

あと、glintとGauche-ARToolKitのサイトは以下の通りです。
http://www.koguro.net/prog/codecheck/index-j.html
http://www.koguro.net/prog/Gauche-ARToolKit/index-j.html

Gaucheでライフゲームを作ってみた

どう書く?orgのお題「ライフゲーム」を実装する過程をニコニコ動画公開してみました*1

D

ただ、模型とかフィギュアの作成動画って門外漢でも見ていて楽しいのですが、プログラムを作るのって他人が見ても何がなんだか分からないですね(時間が経つと、自分でも何考えてたんだか分からなくなってきます)。

*1:前にid:higeponさんのhttp://d.hatena.ne.jp/higepon/20071108/1194495170があったのを思い出したので

pslispをPSプリンタに出してみた

zickさん作の「PostScriptで書いたLisp*1をPSプリンタ(brotherのHL-5070DN)で印刷してみたところ、ちゃんと出力されました。

ちなみに出力するのに結構時間がかかって、上の例だと6分くらい、10の階乗だと10分以上かかります。

中途半端に似ていると微妙に気持ち悪い

http://www.jmuk.org/diary/2007/12/27/0 より

考えの発端となったのは ruby-list の 44398 のスレッド。でもこれ自体はきっかけというに過ぎなくて、この種の話は前々からずっと転がっていたし、前々から考えてはいた。

たとえば 3.hours.from_now みたいなやつだ。あるいは、たとえば RSpec もそうなのかも(よく知らない)。

簡単に言うと、今のところプログラムはプログラミング言語という特殊な言語で書かれるのがふつうだけど、プログラミング言語自然言語として読めるとうれしい、という人がいるようである。

こういう記述って、書くときに混乱しないんだろうか、と思ってしまいます。多分 3.hours.from.now とか 1.hour.from_nowとか書くとエラーになるんだろうなと思うのですが、こういうところでちょっと気持ち悪さを感じます。

結局のところコンピュータでもプログラムを解釈できるようにさせるために、プログラム言語は自然言語ほどの柔軟性をもたせられないので、仮にこれらの記述が行えたとしてもどこかで無理が生ずると思いますが。

プログラム言語が自然言語に似ている場合、何が記述できて何が記述できないのかがドキュメントを見ないと分からない、というのが嫌な原因かも(とはいえ、読むときはなんか楽しさを感じるときもあるんですが)。

gca.el (2007/11/13版)

自分で公開したことをすっかり忘れていましたが、使ってくださる方がいらっしゃるようなので、2007/11/13版のgca.el(http://www.koguro.net/prog/gca/gca-20071113.tar.gz)を公開します。修正点は以下の通りです。

  • 補完の動作を変更しました。今まで補完対象のシンボルがinfoで見つからなかった場合にdabbrevを実行していましたが、補完の候補に現在のバッファにあるシンボルも含めるようにしました。例えば、ソースコード中で "call-proc" とかいうシンボルを定義していた場合、今までは "call-" まで入力して補完すると "call-with-" となってしまいましたが、今回からはちゃんと "call-proc" も候補に上がるようになります。
  • define-moduleのテンプレートに "(select-module ...)" も含めました。

ちなみに gca.el とはGaucheでコードを書くためのEmacs用ユーティリティ集で、以下のような機能を持っています。

  • 単体テストの生成支援
  • シンボルの補完
  • ドキュメント検索
  • (use ...)の挿入
  • テンプレートを使ったstub作成支援

簡単なデモ用ムービーもあります。