Quine
2008-11-02 について Forth とか PostScript とかでの事情
文字列をプログラム中に書くような形式で表示
一度目に読んだときは、 PostScript の == みたいに、文字列をプログラム中に書くような形式で表示してくれる関数/命令/機能がある、というパターンがないかなと思ったけど、よく見たら format 系の所に Ruby の %p が挙げられてた。でも、PostScript の == は全然 format じゃない。
で、PostScript の Quine はこうなります。
(dup == =) dup == =
Ruby の p を使って同様のことはできないのだろうか。追記: できるけど、イマイチなのだそうです。お返事ありがとうございます。
あと、Erlang でも io:format の "~p" で同様なことができるけど、最初のモジュール名を書く部分の改行のせいで上手くいかない。と思ったけど空白でいいのか。
-module(q). -export([m/0]). m()->S="-module(q). -export([m/0]). m()->S=~p,io:format(S,[S]).",io:format(S,[S]).
コードを取り出す
「関数のコードを取り出す」ことは、PostScript や Forth でもできる。
PostScript 版。load の部分でコードを取り出している。
/a {/a == /a load == (def a) =} def a
Forth は see でワード定義を見られる。以下のは Gforth 版。Forth の実装毎に微妙に違ってくる。
: a .\" see a a" ; see a a
ワード a の定義中は a はまだ未定義なので、a の中で see a することができず、外で see a としている所が他の言語とはちょっと違う。
自分を読み込む
Forth の source というワードは、その時インタープリタが読んでいる 1 行が入ったバッファのアドレスと長さを返すので、それをそのまま表示すれば Quine が作れる。
source type
あと、Quine に最適化された言語に m4 も入れてください。