2022-05-18: Sather で Quine を書いた
やったこと
Sather
Sather というプログラミング言語がある。
1990年代に UCB (カリフォルニア州バークレイ校) が開発していたプログラミング言語で、Eiffel 系の構文の言語なのだけど、当時としては先進的な機能 (GC、つよい型付け、多重継承、高階手続きなど) を持っているのが特徴。
とくにイテレータの構文が特徴的で、まずいわゆる while ループは次のように書く。
i:INT := 0;
loop
while!(i < 10);
#OUT + i + "\n";
i := i + 1
end
-- 0 から 9 まで出力
この while! は自由な位置に置くことができて、次のようもできる。
i:INT := 0;
loop
#OUT + i + "\n";
while!(i < 10);
i := i + 1
end
-- 0 から 10 まで出力
要するに、loop 自体は普通の言語の while (true) みたいな感じで、while! の中の条件が偽になった瞬間にループを抜けるような挙動をする。
さらに、while! 以外にも until! などもあるのだが、それ以上にすごいのがこのようなイテレータを自前で定義することができることだろう。
例えば INT 型には for! や downto! といったイテレータが定義されていて 0.for!(10) と loop の中に書くと 0 から 10 までループできたりする。
イテレータを自前で定義したときに、イテレータからループに値を送る構文が yield なのだけど、これも恐らく Ruby と同じく CLU 由来なのだろうと予測している (参考)。
このイテレータは現代の感覚で解釈するとエフェクトみたいな感じがして (実際この上にかなり高度なエフェクトシステムを構築できると思う)、面白いのだけどちょっと扱いづらい印象がある。
というわけで Quine。279言語目。
無駄にイテレータを使っている (elt! と ind!)。あと pretty メソッドが便利。この時代の言語でこういった機能があるのはえらい。
https://github.com/makenowjust/quine/blob/f67711f081757207cb15c5ae23f9a1d1a86cdf3e/quine.sa
ビルドがちょっと面倒で、libgc-dev を入れたあとに make すると大体コンパイルが通るのだけど、そのあとの System/Common/CONFIG のビルドで (自動生成された?) C のコメントが認識できず失敗するので、適当に削除してやると上手くいく。
Quine 自体のコンパイルはこんな感じ。
なんか警告がいっぱい出るけど気にしないこと。
$ Bin/sacomp quine.sa -o quine && ./quine
久々の面白い言語だった。
ビルドファイターズ
最後まで見終わった。
面白かった。ホビーアニメに求められているものをすべてやったのではないかと思う。
いいアニメだ‥‥。