Комментарии 14
А Вы случайно не причастны к курсу «Языки программирования и компиляторы» с Лекториума? Стиль изложения очень похож на тот. Статья интересная)
Простите за офтопик, но прочитал как «мультикавайногенератор», и очень удивился :).
>> ассоциативность по операции сложения (конкатенации) строк: E (x+y) = Ex + Ey.
По-моему, это свойство называется линейность. Один из критериев линейности функции, оператора…
Ассоциативность — это скобки расставлять.
По-моему, это свойство называется линейность. Один из критериев линейности функции, оператора…
Ассоциативность — это скобки расставлять.
Хабр торт.
По существу, хотя, может, это бред: а можно ли как-нибудь упростить себе задачу, если рассмотреть все языки, которые мы хотим использовать в цепочке квайнов, как алгорифмы Маркова или машины Тьюринга?
По существу, хотя, может, это бред: а можно ли как-нибудь упростить себе задачу, если рассмотреть все языки, которые мы хотим использовать в цепочке квайнов, как алгорифмы Маркова или машины Тьюринга?
Ну, у меня были похожие думки, но они слишком далеки от реализации.
Конечно, удобнее всего использовать языки с мощной обработкой строк, идейно близкие к алгорифмам Маркова и машине Поста — рефал, perl, а может быть, даже awk и sed.
Но как максимально обобщить задачу о мультиквайне, я пока не придумал.
Решение вида принтер-принтер-принтер-...-квайн — вот оно, пожалуйста. Причём таких решений может быть много разных.
В статье указаны два: с двумя строками и двойным декорированием и с тремя строками и одинарным декорированием.
Интересно, что добавление каждой ступени к мультипринтеру линейно (а в плохом случае — экспоненциально) увеличивает размер программы.
text = «hello \» world"
P text = «main(){printf(»%s", «hello \\\» world");}
PP text = «main(){printf(»%s",«main(){printf(\»%s\", «hello \\\\\\\» world\");}");}
видите, что там творится с бэкслешами? Они, заразы, удваиваются! (Квайн 30 порядка просто не поместился в память).
Именно поэтому приходится писать окт-код "\134" вместо "\\".
Квайнер же подходит радикально: будучи длиной len(a+b+c) + len(Ex+Ey+Ez), он порождает текст длиной len(Fx+Fy+Fz)+len(x+y+z). То есть, длина квайнера сравнима или меньше длины его результата.
Поэтому следует поискать, как встроить несколько квайнеров в цепочку: принтер1-квайнер2-принтер3-квайнер4…
Ладно, это, пожалуй, тема для статьи.
Конечно, удобнее всего использовать языки с мощной обработкой строк, идейно близкие к алгорифмам Маркова и машине Поста — рефал, perl, а может быть, даже awk и sed.
Но как максимально обобщить задачу о мультиквайне, я пока не придумал.
Решение вида принтер-принтер-принтер-...-квайн — вот оно, пожалуйста. Причём таких решений может быть много разных.
В статье указаны два: с двумя строками и двойным декорированием и с тремя строками и одинарным декорированием.
Интересно, что добавление каждой ступени к мультипринтеру линейно (а в плохом случае — экспоненциально) увеличивает размер программы.
text = «hello \» world"
P text = «main(){printf(»%s", «hello \\\» world");}
PP text = «main(){printf(»%s",«main(){printf(\»%s\", «hello \\\\\\\» world\");}");}
видите, что там творится с бэкслешами? Они, заразы, удваиваются! (Квайн 30 порядка просто не поместился в память).
Именно поэтому приходится писать окт-код "\134" вместо "\\".
Квайнер же подходит радикально: будучи длиной len(a+b+c) + len(Ex+Ey+Ez), он порождает текст длиной len(Fx+Fy+Fz)+len(x+y+z). То есть, длина квайнера сравнима или меньше длины его результата.
Поэтому следует поискать, как встроить несколько квайнеров в цепочку: принтер1-квайнер2-принтер3-квайнер4…
Ладно, это, пожалуй, тема для статьи.
Ждем статью :) Безумству храбрых поем мы песню…
А по поводу алгорифмов Маркова и т.д., я так понимаю, сложность в том, что у каждого языка свои грамматика и синтаксис, поэтому заставить их читать один текст нельзя. Но можно для каждого написать какой-то минимальный интерпретатор алгорифмов Маркова например, с простой спецификацией. Правда, это уже не задача о квайнах :)
А по поводу алгорифмов Маркова и т.д., я так понимаю, сложность в том, что у каждого языка свои грамматика и синтаксис, поэтому заставить их читать один текст нельзя. Но можно для каждого написать какой-то минимальный интерпретатор алгорифмов Маркова например, с простой спецификацией. Правда, это уже не задача о квайнах :)
Добавлю свой квайн на Прологе
s(':- s(X),writef("s(%p). %w.",[X,X])'). :- s(X),writef("s(%p). %w.",[X,X]).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Мультиквайногенератор