После прочитывания показалось, что metaalterator не должен быть бакендом, собственно это и не бакенд - это моделирование данных. Есть определённый смысл оформить его как библиотеку guile.<br><br>Вообще задача моделирования очень сложная - мы кажется уже делали два или три захода - ничего путного не получилось. Очень хочется чтобы metaalterator стал-таки средством моделирования в alterator ;)<br>
<br><br><div class="gmail_quote">13 апреля 2009 г. 19:06 пользователь Pavel Wolneykien <span dir="ltr">&lt;<a href="mailto:manowar@altlinux.org">manowar@altlinux.org</a>&gt;</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. Бакенд отвечает на запросы &quot;type&quot; и производит другого рода<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>
  (&#39;squid &#39;groups ? &#39;domains ?)<br>
<br>
или более имён<br>
<br>
  (&#39;squid &#39;groups *)<br>
<br>
можно обозначить эти пропуски символами, а затем использовать эти<br>
символы в программе:<br>
<br>
  (&#39;squid &#39;groups @g &#39;domains @d)<br>
<br>
после сличения, например, с таким списком: (&#39;squid &#39;groups &quot;wheel&quot;<br>
&#39;domains &quot;altlinux&quot;), переменные @g и @d примут значения &quot;wheel&quot; и<br>
&quot;altlinux&quot; соответственно. Шаблонный параметр вида @имя захватывает 1<br>
значение, а вида @@имя одно и более значений.<br>
<br>
  Шаблон параметров, в отличие от шаблона объектов, может быть опущен, а<br>
при его наличии он используется только для захвата параметров, но не для<br>
сличения. Поэтому порядок перечисления параметров в шаблоне параметров<br>
произвольный. Поскольку каждый параметр в списке параметров однозначно<br>
связан с впередистоящим именем, то параметр вида @@имя используется для<br>
захвата всех значений одного параметра, а вида @имя -- для захвата<br>
только 1, первого значения. Например, шаблон<br>
<br>
  (&#39;http_port @p &#39;auth-mode @a &#39;internal-ifaces @@e &#39;mode @m)<br>
<br>
сохранит под именем @@e все значения параметра &#39;internal-ifaces, а<br>
значение параметра &#39;mode он не &quot;съест&quot;.<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>