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 も入れてください。