Получить "нахаляву" VAST сильно хочется. Но тут есть маленькая-маленькая
загвоздка ("Many Smalltalk VMs do not support the stack-copying
techniques Seaside uses to implement backtracking"). Рассмотрим пример:
b1 := [
какойТоКод1.
result := self call: (КакойТоНаследникMWComponent new
model: бизнесОбъект;
yourself
).
какойТоКод2.
]
t1 := b1 fork.
Выглядит достаточно безобидно. Что внутри?
Нить t1 исполняется приблизительно до "self call: " и
приостанавливается. Большая часть "внутри" "self call:" выполняется в
какой-то другой нити (нитях). Затем "какойТоКод2" должен выполняться
вновь в нити t1.
Сперва кажется, что всё довольно просто. Внутри "self call:" происходит
либо "t1 suspend", либо "[ ... ] fork". Когда-то позднее (при получении
какого-то http-запроса, очевидно), произойдёт "t1 resume".
Проблема в том, что b1 fork разрешается запускать только один раз, а
resume надо вызвать из одной точки неограниченное количество раз. Так
что "какойТоКод1" должен сработать один раз, а "какойТоКод2" неизвестное
количество раз. Как это можно сделать без копирования стека? А если
нельзя, портирование Seaside просто невозможно.
--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru