Программа меняет себя и начинает исполнять свою изменённую копию?.. До тех пор, пока не произойдёт определённое изменение, сигнализирующее о том, что надо прекращать вычисления и давать ответ? Как Вы организуете такую передачу? Я, конечно, отстал от практики программирования довольно сильно, но мне кажется, что стандартные языки этого не разрешают.
Вот классический пример Куайн-программы на Delphi:
Код:
procedure selfprint;
var a: array[1..11]of string; i: integer;
begin
a[1]:=' procedure selfprint;';
a[2]:=' var a: array[1..11]of string; i: integer;';
a[3]:=' begin ';
a[4]:=' for i:=1 to 3 do writeln(a[i]);';
a[5]:=' for i:=1 to 11 do begin';
a[6]:=' write(chr(97), chr(91), i);';
a[7]:=' write(chr(93), chr(58), chr(61));';
a[8]:=' writeln (chr(39), a[i], chr(39), chr(59));';
a[9]:=' end; ';
a[10]:=' for i:=4 to 11 do wtiteln(a[i]);';
a[11]:=' end. ';
for i:=1 to 3 do writeln(a[i]);
for i:=1 to 11 do begin
write(chr(97), chr(91), i);
write(chr(93), chr(58), chr(61));
writeln (chr(39), a[i], chr(39), chr(59));
end;
for i:=4 to 11 do wtiteln(a[i]);
end;
При вызове этой процедуры она печатает свой текст.
Зарезервируем дополнительные строки в массиве
Код:
var a: array [1..13] of string;
…
a[12]:=’true’;
a[13]:=’здесь пишем имя процедуры (или сам код - тогда нужно больше строк зарезервировать в массиве), которую нам нужно выполнять в цикле’;
...
здесь вставляем имя процедуры или ее код, которые нам надо выполнять в цикле (он работает с внешними данными (переменными var, описанными перед всеми процедурами основной программы)
Все циклы увеличим на с 11 до 13 (или сколько нам нужно).
Пишем основную программу. В процедуру, которую нам нужно прогонять неопределенное число раз, до наступления некоего события, вставляем короткий код, который в случае наступления события меняет строку ‘a[12]=true’ в распечатке работы процедуры selfprint на ‘a[12]=false’. Из основной программы отслеживаем это событие после каждого вызова selfprint, либо в самой selfprint (это команда останова).
Получили аналог repeat,while,goto - цикл без заранее заданной границы.
Вы собираетесь перезаписывать текст исполняемой программы в памяти изнутри самой программы? Теоретически это сделать можно, вставляя в программу код низкого уровня, но это запрещённый приём!
Вам шашечки нужны или ехать ?
Вы предлагаете запретить программе работу со строками ?
Вы постоянно уточняете условия, можете ли Вы их сформулировать полно и окончательно ?
И к квайнам всё это отношения не имеет. Квайн всего лишь воспроизводит собственный текст где-то на внешнем устройстве, а о передаче управления на сгенерированный код речи не идёт
Укажите, в каком месте происходит передача управления на сгенерированный код в моем примере и просветите, как, в общем случае, по произвольному тексту алгоритма (в котором Ваши условия выполнены – язык программирования не содержит ни одного while, repeat, goto), Вы собираетесь отслеживать это самое условие ? Это алгоритмически разрешимая задача по Вашему ?