kiyoka.2009_09_14 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2009_09
555555555555555555555555555555555555555555555555555555555555555435
5

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

5

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

5

 

5

シェルトランポリン

5

238-1211521058obji

5

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

5
#/usr/local/bin/nendo
5
.
5
.
5

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

5

 

5

Gaucheのリファレンスにはこんな方法が紹介されている。

5
 Gauche ユーザリファレンス: 3.3 Schemeスクリプトを書くEXT
5
典型的なGaucheスクリプトの最初の行は次のようなものです。
5
  (略)
5
  #!/bin/sh
5
  :; exec gosh -- $0 "$@"
5

よし、パクろう。(笑)

5

と思ったが、':' に何か特別な仕組みを持たせないといけないのかも。ちょっと調べてみた。

5

 

5

Gaucheの ':' は?

5

さっそく実験。まずはgosh

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

うわー、これは何なんだ。よくわからんけど、単体で評価しても無害なようだ。

5

また、':' は破壊できないようだ。

5

SchemeのR5RSの仕様を調べたら、':' は拡張アルファベット文字といってアルファベットと同格として扱って良いみたいだけど...

5

Gaucheはちょっと ':' を特別扱いしているのかな。

5

なので当然こうなる。

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

 

5

bashの ':' は?

5

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

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

 

5

結論

5

Gaucheのように単に無害な ':' を実装すればよいのかもしれない。

5

今度実際にやってみよう。

5

 

4

COMMENT齊藤

Gauche では : を先頭につけた識別子はキーワードとして扱われます。

単体の : でもキーワードとして認識されるようですね。

(keyword? :) は #t になります。

r5rs には無い Gauche 特有の機能ですので、Gauche のマニュアルを見て下さい。

3

COMMENTkiyoka

コメントありがとうございます。

先日、Chaton上でlequeさんにも教えてもらいました。

Gaucheは純粋なSchemeからうまく拡張されていて実用レベルを保っているんだと思いました。

ただ、Nendoにはまだキーワードは入れずにいこうかなと思っています。

5

...comment disabled...