Pull to refresh

Comments 59

Это не извращения. Просто человеку нравится всё контролировать и работать на низком уровне без фреймворков. Я тоже этим страдаю. Это ужасно. :)

С другой стороны, товарищ TheShock ЕМНИП собирался на асме писать фреймворк.
Тока вот все забывают, что жизнь у нас короткая, очень, особенно для такого подхода =)
нормальный такой сервер, действительно один из самых продвинутых на сегодняшний день и развивающихся.
но вот писать html на сommon lisp не очень удобно, было бы лучше если бы был какой-то хороший template toolkit, который видимо никогда не появится, потому как «s-expressions это же так удобно для написания html. они же тоже имеют древовидную структуру!»
Автор RESTAS с вами согласен и поэтому написал cl-closure-template. github.com/archimag/cl-closure-template

Но всё-таки, что такого ужасного в написании xhtml на s-expression'ах?
то, что каждый сверстаный шаблон полученный от дизайнера нужно переписывать еще на одном языке.
Статичные страницы можно и просто в html отдавать, а шаблоны всё-равно в каждом фреймворке свои, просто hunchentoot+who меняет синтаксис чуть сильнее, чем большинство.
Особо хочется подчеркнуть что меняется только синтаксис. xhtml как язык никто не трогает, просто в who он записывается немного по-другому.
причём удобнее, поскольку не надо лепить закрывающие теги
Не надо, использовать cl-who в серьёзных проектах никто в здравом уме не будет. cl-who годится только для небольших демонстраций.
Во-первых, про дизайнеров тут уже всё сказали. Но даже если в роли дизайнера выступает программист, то всё равно использование системы шаблонов намного более эффективно. При использовании cl-who происходит жуткое раздувание основного кода, потом по нему надо тыкаться и исправлять логику. Это очень не эффективно.

Во-вторых, cl-who (если не лезть в кишки) не позволяет эффективно составлять страницы из разных частей.

Шаблонизаторы это сейчас единственный приемлемый способ генерации контента, как бы доказано всей практикой веб-разработки. Та же E-factory из lxml (Python) будет, например, удобней, чем cl-who, но никто не использует её для генерации веб-страниц.
Знаете, я использовал CL-WHO долго и всерьёз, и скажу вам следующее. Структура html и любых других теговых языков этого типа объективно сложнее структуры без закрывающих тегов — закрывающие теги скорее для машины, для её удобства парсинга. А то что сегодня попсовое направление за php или python совсем не означает что обучаемому человеку это будет трудно освоить.

Теперь о модульности и разбухании кода. Построение web-страницы при помощи CL-WHO прекрасно разбивается на функции, которые повторно используются, не говоря уже о Lisp-макросах, которые генерируют обширные фрагменты кода с нетривиальной логикой на основании короткой спецификации по-сути.
Насколько долго?

lisper.ru я сначала так и писал. Потом передела на шаблонах и насколько же всё стало проще. Закрывающиеся тэги здесь вообще не при чём, редактируйте шаблоны в нормальном редакторе (Emacs) и не будете иметь с ними никаких проблем.

> Построение web-страницы при помощи CL-WHO прекрасно разбивается на функции

Нет, не разбивается, ибо cl-who специальным образом перерабатывает дерево с кодом и генерирует на его основании новый код, вы не сможете разбить шаблон на несколько функций (если не использовать недокументированные возможности).

> не говоря уже о Lisp-макросах

А, так дизайнер должен ещё и макросы освоить? Для такой тривиальной задачи как генерация html не имеет никакого смысла привлекать тяжёлую артиллерию. Иначе идёт усложение простейших вещей, которые решаются элементарно за счёт шаблоново.

Кроме того, при использовании cl-who происходит смешивание логики приложения с логикой представления и править это потом просто кошмар, особенно учитывая какие простыни кода при этом получаются при генерации реальный веб-страниц.
Нет, не разбивается, ибо cl-who специальным образом перерабатывает дерево с кодом и генерирует на его основании новый код
> меня мало волнует то, что там генерируется, меня волнует лишь то, что фрагменты CL-WHO DSL прекрасно разбиваются на функции и прекрасно генерируются макросами, а внутренняя кухня с записью строк в поток вывода меня не волнует, если нет проблем с производительностью (а их почти никогда не бывает в этом месте).

А, так дизайнер должен ещё и макросы освоить?
> Не должен, мы все должны стремиться к отделению кода от стилей (хотя это не всегда возможно). Дизайнеру дизайнерово — править стили и статические ресурсы.

Кроме того, при использовании cl-who происходит смешивание логики приложения с логикой представления
> Не происходит, если использовать CL-WHO по назначению, а именно строго разделять бизнес логику (чистый CL) от построения html/xml (вот тут CL-WHO). CL-WHO не претендует на роль языка бизнес-логики — это всего лишь удобный способ записи SGML-выражений, XML-подмножество которого, к сожалению, сейчас правит миром.
Ладно, в мире CL есть такая болезнь, над которой смеются все веб-разработчики: старание генерировать html/xml через s-выражения и cl-who часть этой болезни. Веб-разработка на CL становится значительно проще если от этой болезни избавиться.
У меня нет какого либо желания переубеждать конкретно вас, в конце концов, это ваш личный выбор. Но в подобных статьях, цель которых, насколько я понимаю, — популяризация, нельзя обходиться только cl-who, ибо это производит очень негативное впечатление на опытных веб-разработчиков.
"… определяющую простой и удобный DSL для генерации HTML/XML. Как водится, лучше один раз увидеть" ©.

Господи… Это же надо такое придумать… Нужно точно один раз увидеть, чтоб понять какой он «простой» и «удобный»…

Уважаемый, Вы будете один писать или у вас уже команда собралась?
Вы наверное не знаете Common Lisp. Всё равно, что я читал бы исходники на Perl. Для знающего человека этот код очень прост, можно сказать прозрачен.
Я на Lispe делал презентацию в университете. Уж Вы меня извините, но template язык, типа, velocity куда проще, нежели приведённый вами пример. Показываю:

Ваш пример:

показываю:

(push :tag3 *html-empty-tags*)
(with-html-output-to-string (http-stream)
(:tag1 :attr1 1 :attr2 «2»
(:tag2 :attr3 (+ 1 2))
(loop for i from 1 to 3 do
(with-html-output (http-stream)
(:tag3 :attr4 (when (oddp i) «odd»))))))

результат:
"
/><tag3 />/>"

что именно тут нужно достичь? не проще ли сделать так:

где вся структура .html уже заранее прописана и легко читаема каждому?
Госпади, хабр всё захабрил (причём не правильно парсиг ещё и сработал)… Вот пример:

<tag1 attr1='$map.key' attr2='$map.value'>
Тому кто ставит минусы, хочется сказать, что нужно приводить конкретные коментарии, а не кидать гранатами из-за окоп. Итак, коментарии…
(минусы ставить Хабраобщество не даёт)

Просто хочу уточнить.

<tag1 attr1='$map.key' attr2='$map.value'>

Выведет то же самое, что и

(push :tag3 *html-empty-tags*)
(with-html-output-to-string (http-stream)
  (:tag1 :attr1 1 :attr2 «2»
    (:tag2 :attr3 (+ 1 2))
    (loop for i from 1 to 3 do
      (with-html-output (http-stream)
      (:tag3 :attr4 (when (oddp i) «odd»))))))

?

У вас половина тегов в каждом примере сожралась. Приведите их в порядок, может и комментарии последуют.
Приведите, пожалуйста, более коректный пример, а не пример притянутый за уши из потолка.

пс: почему хабр не может все теги просто заменить на > <?
Я просто ваш пример повторил. Т.е. вы признаёте, что ваш пример притянут за уши с потолка?

Если я не уловил вашу мысль, то вот и ответ на вопрос почему нет комментов. Её никто не уловил.
Пример автора в котором я лично совсем не понимаю смысла:

#set( $attr3 = 1 + 2 ) // улетает в контроллер
<tag1 attr1='1' attr2='2'>
    <tag2 attr3='$attr3'></tag2>
    #foreach(i in [1..3])
        <tag3 #if( $oddp == $i )attr4='odd'#{end} /><tag3 />
    #end
</tag1>

1. Что это такое? Это какой-то объект? Может тут темплате вообще не нужен?

2. Вы весь xhtml собираетесь переписать на языке, типа, (:tag2 :attr3 (+ 1 2)))?

3. Укажите, в каких же местах template ваше «чудо» выигрывает, например, в простоте кода.
1. Да не объект это, а просто элементарный пример без конкретики, CL-WHO неплевать на имена тегов, атрибутов, т.е. он не знает о HTML.

2. XHTML никуда не делся, вместо tag1 пишите html, вместо tag2 — head…

3. Хотя бы в том, что не надо писать закрывающих тегов.
1, 2, 3. Это не аргументы, такой код не просматриваемый (1) уже на 50 строчках и его тяжело поддерживать.

(2) Им не сможет заниматься дизайнер (если речь идёт о веб-е) или тяжело (не реально) найти человека/ОВ.
Не могу согласиться ни с (1) ни с (2).
То есть, Вы утверждаете, что примером приведённым Вами в главе «генерация HTML» может заниматься любой дизайнер и делает это с лёгкостью? Фуф… ню тогда успехов Вам, что ещё можно тут сказать.
Всегда радовали люди свято верящие в необучаемость коллег.

Изучение cl-who ничем не сложнее, чем изучение очередного модного шаблонного движка, вроде того, на котором приведены ваши примеры.
Дизайнер не сможет править cl-who, ибо там код на CL. Что, дизайнер должен изучить CL? И при этом его надо пускать в код с логикой? Лучше дизайнеров держать подальше от таких вещей. А сами шаблоны не должны быть частью кода. Всем будет от этого лучше, и прежде всего самим разработчикам.
Если человек умеет хорошо верстать/ рисовать, но не умеет программировать/ никогда не программировал/ программировал, но не на этом языке/ недостаточно опыта для Вашего проекта/ тут допишите сами, то Вы не научите его этому, хоть лоб разбейте — для этого нужно много времени. В условиях бизнеса времени никогда не достаточно. Вы богатый человек/ у Вас богатая фирма которая занимается благотворительностью?
UFO just landed and posted this here
А ещё можно попробовать новую систему: www.quicklisp.org/beta/

Только предупреждаю, «beta» там не для галочки написано. Иногда падает.
Но лучший вариант — ставьте менеджером пакетов вашего любимого дистрибутива, если hunchentoot там есть.
UFO just landed and posted this here
Там всего 4 или 5 библиотек, от которых он зависит (ссылки на сайте). Можете просто их по очереди скачать и поставить.
В прошлой части я объяснял, как это делать.
UFO just landed and posted this here
UFO just landed and posted this here
Понравилась ваша постановка вопроса: «Подскажите, пожалуйста, как выяснить, кто здесь дебил.»))

Надо не hutchentoot, а hunchentoot
UFO just landed and posted this here
Планировал написать ещё одну часть (про работу с PostgreSQL), но вижу что не особо востребованно…
Впечатлило. Просто тех кто впечатлило в комментариях нет — они пробуют. Пиши про постгресс, ждем
Я бы почитал. Интересно же.
Ваша статья ориентирована на начинающих, с этим есть одна проблема. Вы начинаете с этого:

(hunchentoot:start (make-instance 'hunchentoot:acceptor :port 8080))

и продолжаете этим:

Рассмотрим простейший обработчик, взятый из справки по Hunchentoot:

(hunchentoot:define-easy-handler (say-yo :uri "/yo") (name)
(setf (hunchentoot:content-type*) «text/plain»)
(format nil «Hey~@[ ~a~]!» name))

Чтобы оно вместе работало, надо использовать не acceptor, а easy-acceptor:

(hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 8080))

иначе простейший обработчик из документации не работает.
Весь код, который я приводил, был мною тестирован. Возможно, он не очень актуален для текущей версии Hunchentoot.
Скажите, вы чем пользуетесь для демонизации и использовании 80 порта для hunchentoot?
Весь код, который я приводил, был мною тестирован. Возможно, он не очень актуален для текущей версии Hunchentoot.
Sign up to leave a comment.

Articles

Change theme settings