После прочитывания показалось, что metaalterator не должен быть бакендом, собственно это и не бакенд - это моделирование данных. Есть определённый смысл оформить его как библиотеку guile.<br><br>Вообще задача моделирования очень сложная - мы кажется уже делали два или три захода - ничего путного не получилось. Очень хочется чтобы metaalterator стал-таки средством моделирования в alterator ;)<br>
<br><br><div class="gmail_quote">13 апреля 2009 г. 19:06 пользователь Pavel Wolneykien <span dir="ltr"><<a href="mailto:manowar@altlinux.org">manowar@altlinux.org</a>></span> написал:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Всем привет, :)<br>
<br>
При использовании (alterator metalterator) и ajax.scm возникает (по<br>
крайней мере у меня возник) соблазн вовсе не использовать промежуточный<br>
бакенд. Это, наверное, нормальная реакция человеческого организма на<br>
многозвенную архитектуру. Но я не стал этого делать. А вместо этого<br>
постарался отвести бакенду достойную роль.<br>
<br>
Получилось у меня следующее.<br>
<br>
1. Бакенд закрывает метабакенд от произвольного к нему доступа.<br>
<br>
Ведь через метабакенд можно читать и писать произвольные объекты, в<br>
том числе, и не предусмотренные конкретным модулем Альтератора.<br>
<br>
Кроме лишних объектов метабакенду можно отправить и просто<br>
некорректные (с точки зрения работы конкретного модуля) данные. А<br>
проверкой данных на корректность у нас тоже традиционно<br>
занимается бакенд.<br>
<br>
2. Бакенд отвечает на запросы "type" и производит другого рода<br>
проверку корректности данных.<br>
<br>
А ещё в интерфейс часто нужно выводить какой-либо набор констант,<br>
причём с комментариями на местном языке. Для этой цели тоже можно<br>
использовать бакенд.<br>
<br>
3. Бакенд отвечает на запросы о константах.<br>
<br>
<br>
Вторая и третья задача решаются традиционными способами, а первая<br>
требует непропорционально увесистого куска кода: использовать большой<br>
набор условных операторов перед проксированием операции чтения/записи в<br>
метабакенд (где она, фактически, и будет выполнена) показалось мне<br>
скучным. Поскольку речь идёт об определении некоторого шаблона, через<br>
который определённые вызовы проходили бы, а определённые -- нет<br>
(выдавалось бы сообщение об ошибке), то я придумал набор макросов,<br>
позволяющий описать такой шаблон в более компактном виде.<br>
Называется он woo-case.<br>
<br>
Формат его вызова такой:<br>
<br>
(woo-case (список_объектов список_параметров)<br>
((имя_операции_1 (шаблон_объектов_1) [(шаблон_параметров_1)])<br>
вычисление_1 ...)<br>
((имя_операции_2 (шаблон_объектов_2) [(шаблон_параметров_2)])<br>
вычисление_2 ...)<br>
...<br>
else вычисление_по_умолчанию)<br>
<br>
Шаблон объектов используется при выполнении двух действий:<br>
сличения списка объектов и захвата параметров.<br>
<br>
Вместо того, чтобы просто обозначить в шаблоне место, где могут<br>
находится одно<br>
<br>
('squid 'groups ? 'domains ?)<br>
<br>
или более имён<br>
<br>
('squid 'groups *)<br>
<br>
можно обозначить эти пропуски символами, а затем использовать эти<br>
символы в программе:<br>
<br>
('squid 'groups @g 'domains @d)<br>
<br>
после сличения, например, с таким списком: ('squid 'groups "wheel"<br>
'domains "altlinux"), переменные @g и @d примут значения "wheel" и<br>
"altlinux" соответственно. Шаблонный параметр вида @имя захватывает 1<br>
значение, а вида @@имя одно и более значений.<br>
<br>
Шаблон параметров, в отличие от шаблона объектов, может быть опущен, а<br>
при его наличии он используется только для захвата параметров, но не для<br>
сличения. Поэтому порядок перечисления параметров в шаблоне параметров<br>
произвольный. Поскольку каждый параметр в списке параметров однозначно<br>
связан с впередистоящим именем, то параметр вида @@имя используется для<br>
захвата всех значений одного параметра, а вида @имя -- для захвата<br>
только 1, первого значения. Например, шаблон<br>
<br>
('http_port @p 'auth-mode @a 'internal-ifaces @@e 'mode @m)<br>
<br>
сохранит под именем @@e все значения параметра 'internal-ifaces, а<br>
значение параметра 'mode он не "съест".<br>
<br>
В том случае, если какой либо из обозначенных параметров не был<br>
указан, то значение соответствующей переменной будет равно #f.<br>
<br>
<br>
И последнее, но немаловажное: если какая-либо переменная вида @имя<br>
(или @@имя) уже была определена в результате предыдущей операции<br>
сличения/захвата, то в следующем шаблоне будет использовано _её<br>
значение_. Таким образом, во вложенных конструкциях woo-case можно<br>
использовать значения, определённые внешними шаблонами -- получатся<br>
контекстно-зависимые шаблоны.<br>
<br>
Павел.<br>
_______________________________________________<br>
devel-conf mailing list<br>
<a href="mailto:devel-conf@lists.altlinux.org">devel-conf@lists.altlinux.org</a><br>
<a href="https://lists.altlinux.org/mailman/listinfo/devel-conf" target="_blank">https://lists.altlinux.org/mailman/listinfo/devel-conf</a></blockquote></div><br>