Изучаю лисп уже пару-тройку месяцев, и возникла задача удобно генерировать html. Смотрел другие библиотеки, но не понравилась cl-who схема генерации html (взято с http://archimag-dev.blogspot.com/2010/01/hello-world-restas.html):
(define-route main ("" :method :get)
(who:with-html-output-to-string (out)
(:html
(:body
((:form :method :post)
((:input :name "message"))
((:input :type "submit" :value "Send")))))))
Я сделал несколько другую модель генерации, когда функция, генерирующая тег, по сути позволяет использовать &key и &rest параметры одновременно.
Пример (если переделать вышеуказанный):
(load "z.lisp")
(define-route main ("" :method :get)
(z:html
(z:body
(z:form :method "post"
(z:input :name "message")
(z:input :type "submit" :value "Send")))))
Мне кажется, так несколько удобней.
Все это удовольствие лежит здесь: http://github.com/zdo/z
Единственная проблема, которая возникла у меня, это то, что макрос define-property-macro (src/z.lisp) «скрытно» (неявно) предлагает использовать внутри него генерируемые переменные property-list и content-list, которые представляют собой список строк, соответственно, для аттрибутов тега и его содержимого. Вопрос в том, как сделать явным факт возможности использования этих переменных?
Как пример неявных переменных:
(define-property-macro div (list :align :title :class)
(with-double-property-tag "div" properties-list content-list)
И, заодно, так как я новичок в лиспе, интересно было бы услышать замечания по поводу кода.