
Я пытался написать самовоспроизводящуюся программу ("quine") в чистом (без макросов) GNU nroff
. Конечно, это бессмысленно и эксцентрично, но, похоже, этого никто раньше не делал. Мне это не удалось.
Я почти уверен, что тот, кто преуспеет в написании языка ввода без макросов nroff
quine, должен будет определить строки, макросы или "ящики". Для этого вам нужно написать запросы типа:
.as s "just assigned this to string s
.de xxx
.nop "\*s"
..
.xxx
То есть каждый запрос во nroff
входных данных имеет «.» в начале строки.
Поскольку квайны просто выводят свой исходный код (без мошенничества), вывод, вероятно, должен содержать «.» в качестве первого символа нескольких выходных строк.
Как, черт возьми, заставить GNU nroff
выводить символ '.' в начале строки? Никакое количество косвенных ссылок или экранирований не может сделать этого, насколько я могу судить. Есть ли какой-то скрытый запрос, который выводит '.' в начале строки?
Я использую недавно синхронизированный 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...