
私は、生の(マクロなしの)GNU で自己複製プログラム(「quine」)を書こうとしましたnroff
。確かに、これは無意味で風変わりですが、これまでに行われたことがないようです。私は失敗しました。
マクロなしのnroff
入力言語 quine の作成に成功する人は、文字列、マクロ、または「ボックス」を定義する必要があると確信しています。そのためには、次のような要求を記述する必要があります。
.as s "just assigned this to string s
.de xxx
.nop "\*s"
..
.xxx
つまり、nroff
入力内のすべてのリクエストの行の先頭には「.」が付きます。
quines はソース コードを出力するだけなので (不正行為は行いません)、出力には複数の出力行の最初の文字として '.' が含まれる可能性があります。
一体どうしたら GNUnroff
で行頭に '.' 文字を出力させることができるのでしょうか? 私の知る限り、間接参照やエスケープをいくら使ってもそれはできません。行頭に '.' を出力する隠れた要求があるのでしょうか?
私は最近同期した、Groff 1.22.3 がインストールされた Arch Linux を使用しています。
答え1
からmdoc(7)
The special meaning of a punctuation character may be escaped with the string ‘\&’
それで:
\&.
しかし、これは後続の行と組み合わせると、次のような点で扱いにくい場合があります。
\&.
\&.as s "nron, nroff--very good, again!
一緒に実行すると、大量の空白行が生成されます。
$ nroff blah | head -2
. .as s "nron, nroff‐‐very good, again!
ただし、空白行を追加したり、他のマクロを使用したりすることで修正できます。
\&.
\&.as s "nron, nroff--very good, again!
それがクインのニーズにどう影響するかは分かりませんが...
答え2
.tr
文字のペアを翻訳元と翻訳先に指定して、翻訳を設定できます。例: 翻訳#
先.
:
nroff <<\!
.tr #.
###abc...
!
生産する
...abc...