in4 писал(а):
Потенциально. А на деле не хватает нескольких механизмов.
Каких?
in4 писал(а):
Разве что алгоритм работы существенно зависит от обрабатываемых данных.
Пусть зависит, иначе не интересно.
in4 писал(а):
а нужно ли ее именно компилировать или использовать структуры данных для хранения этой последовательности - можно решить при оптимизации алгоритма.
А есть ли смысл разделять "компиляцию кода" и "создание структуры данных"?
***
Еще один гипотетический случай самопрограммирования.
Попробуем реализацию машины "из коробков" Д.Мичи (воспетую Гарднером и Саберхагеном).
Машина, предназначенная для игры в простые игры - шашки 4*4, крестики-нолики, Баше, лабиринт - состоит из коробков с разноцветными бусинами. Каждый коробок соответствует некой игровой ситуации. Цвет бусины соответствует варианту поведения (ходу) машины. Сеанс игры соответствует в случайном выборе бусин. Если машина выигрывает - в сыгравшие коробки добавляются бусины, того цвета, который был выбран. Если проигрывает - сыгравшие бусины удаляются (добавляются бусины других цветов).
Через несколько партий машина научается играть.
FORTH-реализация вполне может состоять в создании слов-коробков.
КОРОБОК создается автоматически при появлении в игре новой комбинации.
При создании в каждый коробок прошивается столько слов-БУСИН, сколько возможно вариантов:
Код:
СТАРТ LIT e1 LIT k1 БУСИНА LIT e2 LIT k2 БУСИНА ... LIT eN LIT kN БУСИНА ФИНИШ EXIT
где
Код:
: СТАРТ IP>ИГРОСТЕК 0 0 ;
: БУСИНА ( e k eI kI -- e' k+kI)
ROT OVER + ВЫПАЛО? IF ROT ELSE SWAP THEN DROP ;
: ФИНИШ DROP DUP >ИГРОСТЕК EXECUTE ;
ИГРОСТЕК используется для запоминания сыгравших вариантов.
IP>ИГРОСТЕК - запоминает в в ИГРОСТЕКЕ адрес первого LIT в КОРОБКЕ.
kI - число бусин.
eI - адрес процедуры хода.
ВЫПАЛО? ( k1, k2 -- k2, f) выдает TRUE c вероятностью k1/k2 (в случае k2 == 0 - TRUE).
Обучение состоит в прохождении ИГРОСТЕКА, заполненного парами КОРОБОК-e1, и соответствующем измененении kI.
Можно, конечно, хранить КОРОБКИ в честных списках, вынеся за пределы шитого кода.
Получится гораздо короче (LIT-ы и БУСИНЫ уйдут, останутся только пары eI-kI).
По сути, это просто выбор между прямым и косвенным шитым кодом.
Ведь список пар eI-kI - именно косвенный шитый код.
Может, кто-то придумает более удачные примеры самопрограммирования?
P.S. Внезапно. А ведь слово "!" - компилирующее. Оно пишет не "код", а "данные"? А FORTH-у не пофиг?!
P.P.S. Обобщенная FORTH-машина из коробков:
ПОТОК команд игрока;
СЛОВАРЬ содержит набор КОРОБКОВ;
ЗНАЧЕНИЕ описывает позицию на момент хода машины и ее нормализации;
СТЕК содержит набор сыгравших КОРОБКОВ и выбранных ходов;
ОК - выдача позиции игроку;
СИМВОЛ - распознание/нормализация позиции;
ВЫПОЛНИТЬ - если необходимо, создание нового КОРОБКА и выбор хода;
КОМПИЛИРОВАТЬ - в конце игры провести обучение КОРОБКОВ, сохраненных в стеке;
СЛЕДУЮЩИЙ - зависит от реализации.