我尝试用原始(无宏)GNU 编写一个自我复制程序(“quine”)nroff
。诚然,这是毫无意义且古怪的,但以前似乎没有这样做过。我没有这样做。
我非常确定,无论谁成功编写了无宏nroff
输入语言 quine,都需要定义字符串、宏或“框”。为此,您需要编写如下请求:
.as s "just assigned this to string s
.de xxx
.nop "\*s"
..
.xxx
也就是说,nroff
输入中的每个请求都有一个“.”。在该行的开头。
由于 quines 只是输出它们的源代码(没有作弊),因此输出可能必须有“.”。作为多个输出行的第一个字符。
你到底如何让 GNUnroff
输出一个“.”字符位于行首?据我所知,没有任何间接或转义可以做到这一点。是否有一些输出“.”的隐藏请求在一行的开头?
我正在使用最近同步的 Arch Linux,其中安装了 Groff 1.22.3。
答案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...