kiyokaのブログアーカイブ

Archive of old blog posts

シェルトランポリンの実現方法

私がRubyで書いているLisp方言、 [Nendo]について。

シェルトランポリン

img NendoはRubyで実装しているので、スクリプトをこんな風に始めることはできない。

#/usr/local/bin/nendo
.
.

Rubyのライブラリを静的リンクをすれば出来るけれどそれは大袈裟過ぎるので避けたい。

Gaucheのリファレンスにはこんな方法が紹介されている。 Gauche ユーザリファレンス: 3.3 Schemeスクリプトを書く

典型的なGaucheスクリプトの最初の行は次のようなものです。
  (略)
  #!/bin/sh
  :; exec gosh -- $0 "$@"

よし、パクろう。(笑) と思ったが、’:’ に何か特別な仕組みを持たせないといけないのかも。ちょっと調べてみた。

Gaucheの ‘:’ は?

さっそく実験。まずはgosh

bash-3.2$ gosh
gosh> :
:
gosh> (if : 1 2)
1
gosh> (symbol? 'a)
#t
gosh> (symbol? ':)
#f
gosh> (set! : 1)
*** ERROR: Compile Error: syntax-error: malformed set!: (set! : 1)
"(stdin)":5:(set! : 1)

うわー、これは何なんだ。よくわからんけど、単体で評価しても無害なようだ。 また、’:’ は破壊できないようだ。 SchemeのR5RSの仕様を調べたら、’:’ は拡張アルファベット文字といってアルファベットと同格として扱って良いみたいだけど… Gaucheはちょっと ‘:’ を特別扱いしているのかな。 なので当然こうなる。

gosh> :; exec gosh -- $0 "$@"
:

bashの ‘:’ は?

bash の’:’は常に真を返すコマンドとして有名だ。

bash-3.2$ :
bash-3.2$ echo $?
0

bash-3.2$ while :
> do
>   date
>   sleep 1
> done
2009年 9月14日 月曜日 21時57分49秒 JST
2009年 9月14日 月曜日 21時57分50秒 JST
2009年 9月14日 月曜日 21時57分51秒 JST
2009年 9月14日 月曜日 21時57分52秒 JST
  C-c C-c  (中断)

結論

Gaucheのように単に無害な ‘:’ を実装すればよいのかもしれない。 今度実際にやってみよう。


コメント by 齊藤:
Gauche では : を先頭につけた識別子はキーワードとして扱われます。 単体の : でもキーワードとして認識されるようですね。 (keyword? :) は #t になります。 r5rs には無い Gauche 特有の機能ですので、Gauche のマニュアルを見て下さい。


コメント by kiyoka:
コメントありがとうございます。 先日、Chaton上でlequeさんにも教えてもらいました。 Gaucheは純粋なSchemeからうまく拡張されていて実用レベルを保っているんだと思いました。 ただ、Nendoにはまだキーワードは入れずにいこうかなと思っています。

コメント by 齊藤:
Gauche では : を先頭につけた識別子はキーワードとして扱われます。 単体の : でもキーワードとして認識されるようですね。 (keyword? :) は #t になります。 r5rs には無い Gauche 特有の機能ですので、Gauche のマニュアルを見て下さい。