
tentei escrever um programa auto-replicante ("quine") em GNU bruto (sem macros) nroff
. É certo que isto é inútil e excêntrico, mas não parece ter sido feito antes. Eu não consegui fazer isso.
Tenho certeza de que quem conseguir escrever uma nroff
linguagem de entrada sem macro precisará definir strings, ou macros ou "caixas". Para fazer isso, você precisa escrever solicitações como:
.as s "just assigned this to string s
.de xxx
.nop "\*s"
..
.xxx
Ou seja, toda solicitação na nroff
entrada possui um '.' no início da linha.
Como os quines apenas geram seu código-fonte (sem trapaça), a saída provavelmente deve ter '.' como o primeiro caractere de várias linhas de saída.
Como diabos você faz o GNU nroff
gerar um '.' caractere no início de uma linha? Nenhuma medida indireta ou fuga pode fazer isso, pelo que posso dizer. Existe alguma solicitação oculta que gera um '.' no início de uma linha?
Estou usando o Arch Linux sincronizado recentemente, que possui o Groff 1.22.3 instalado.
Responder1
Demdoc(7)
The special meaning of a punctuation character may be escaped with the string ‘\&’
Então:
\&.
No entanto, isso pode ser complicado em combinação com linhas subsequentes, como coisas como
\&.
\&.as s "nron, nroff--very good, again!
Executar juntos (e produzir um monte de linhas em branco)
$ nroff blah | head -2
. .as s "nron, nroff‐‐very good, again!
Embora você possa corrigir isso adicionando uma linha em branco ou possivelmente usando outras macros
\&.
\&.as s "nron, nroff--very good, again!
Embora eu não saiba como isso afetará as necessidades do quine...
Responder2
Você pode configurar uma tradução .tr
que leva pares de caracteres para traduzir de-para. Por exemplo, para traduzir #
para .
:
nroff <<\!
.tr #.
###abc...
!
produz
...abc...