tag:blogger.com,1999:blog-4007342736133040943.post2752533810529542573..comments2023-03-26T06:09:18.992+03:00Comments on Clojure: DSL для конфигурации приложенияDmitryhttp://www.blogger.com/profile/17434341697941378483noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-4007342736133040943.post-30693282863359357402011-07-14T16:08:42.053+03:002011-07-14T16:08:42.053+03:00Ну и ок :-)
Кстати, мне очень нравится то, что ты ...Ну и ок :-)<br />Кстати, мне очень нравится то, что ты делаешь для лиспа. Нас, лисперов, вообще мало, так что закончим этот спор и пойдем двигать технологию :-)Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-40594552848494461552011-07-14T16:01:24.428+03:002011-07-14T16:01:24.428+03:00> Твое личное мнение -- не самый весомый аргуме...> Твое личное мнение -- не самый весомый аргумент.<br /><br />Это (моё личное мнение) вообще не аргумент, но мне казалось, что функция комментариев предназначена именно для того, что бы его высказывать.archimaghttps://www.blogger.com/profile/07997791035847047137noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-38963658388458614052011-07-14T14:42:12.632+03:002011-07-14T14:42:12.632+03:00Твое личное мнение -- не самый весомый аргумент. П...Твое личное мнение -- не самый весомый аргумент. Посмотри, например, сюда: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-16.html#%_sec_2.3.2 . Здесь разрабатывается математический язык для символоного дифференцирования. Это самый настоящий DSL, предназначенный только для одной задачи. О нем в главе и говорят, как о расширении языка для дифференцирования выражений. С другой стороны, это просто набор функций -- чистый API.<br />То, что подразумеваешь под DSL-ом ты -- это одно из его подмножеств, external DSL. На лиспе же, наоборот, как правило пишут internal DSL-ы, для этого он и предназначен. Многие вообще предлагают использовать лисп как метаязык, фабрику DSL-ов. Ну а любой внутренний DSL на любом языке -- это просто сфокусированный на задаче API. Пруфлинк: [1]. Там же есть и каталог паттернов, помогающих реализовать внутренний ДСЛ на мейнстримных языках как простой API.Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-46295239276185955092011-07-14T14:19:10.687+03:002011-07-14T14:19:10.687+03:00> мы можем DSL-ом назвать даже просто удачно
&...> мы можем DSL-ом назвать даже просто удачно <br />> спроектированный API <br /><br />Вот это я считаю маразмом, полностью компрометирующим понятие DSL.archimaghttps://www.blogger.com/profile/07997791035847047137noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-79721243366537374052011-07-14T13:12:19.132+03:002011-07-14T13:12:19.132+03:00@andy128k: сильно сказал! :-)@andy128k: сильно сказал! :-)Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-57118168046983453782011-07-14T13:10:41.045+03:002011-07-14T13:10:41.045+03:00> мы можем DSL-ом назвать даже просто удачно сп...> мы можем DSL-ом назвать даже просто удачно спроектированный API безо всяких дополнительных синтаксисов.<br /><br />Во-о-от! И я так считаю. Более того DSL-ем вполне можно назвать удачно написанные flet/labels/macrolet. Особенно если они позволяют придать коду декларативный вид.andy128khttps://www.blogger.com/profile/11404034355392966133noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-202270816262800112011-07-14T13:04:07.656+03:002011-07-14T13:04:07.656+03:00@archimag
Сила подхода DSL в том что он позволяет ...@archimag<br />Сила подхода DSL в том что он позволяет перетянуть пограничные языки/форматы "вправо" за счёт примешивания хост-языка.<br /><br />DSL -- это **в том числе** и языки описания данных.<br /><br />Упомянутый тобой XSLT это же просто xml! :) Запишу я make-файл в синтаксисе какого-нибудь YAML али JSON и ты в нём не признаешь DSL :)<br /><br />Видишь к чему мы приходим? Грань между языком и данными размывается. А где этой грани нет вовсе? В лиспе же!andy128khttps://www.blogger.com/profile/11404034355392966133noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-20697953216739074152011-07-14T12:59:30.640+03:002011-07-14T12:59:30.640+03:00Примеры, которые ты привел, относятся к external D...Примеры, которые ты привел, относятся к external DSL, для их реализации необходимо их парсить. Внутренний DSL, реализованный на Python или JS, для сложных вложенных структур данных также потребует построения дерева и процедур его обхода. В лиспе это не нужно, т.к. деревом является сам исходник.<br />Более того, если вспомнить тот же SICP (первую главу про уровни абстракции), мы можем DSL-ом назвать даже просто удачно спроектированный API безо всяких дополнительных синтаксисов. Условием для этого является возможность решения задач предметной области с применением только лишь этого API без использования конструкций из нижних уровней, например, оператора условного перехода. Например, мой API может принимать управляющие решения на основе текущей даты даже при остутствии оператора if.Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-80080799968620132302011-07-14T12:26:09.906+03:002011-07-14T12:26:09.906+03:00@andy128k
Хорошая, кстати, ссылка, там рисунок как...@andy128k<br />Хорошая, кстати, ссылка, там рисунок как раз соответствует моим представлениям. Вот XSLT или PostScript (имел с ними большой опыт работы) я понимаю DSL. А о пограничных случаях нужно говорить очень осторожно. Вот там указан regexps - да, пограничный случай, а Glade ещё более пограничный.<br /><br />Получается рассказ о преимуществах Лисп для создания DSL, которые на самом деле весьма спорные (DSL) и относятся к пограничным случаям. <br /><br />Это же просто мошенничество )) Ведь под DSL большинство понимают тот же XSLT, make, но для создания подобных DSL Лисп по своей природе никаких особых преимуществ не даёт. А большинство упоминаний DSL в контексте лисп куда более близки к понятию "формат данных" При том, что в лиспе очень неудобно записать сложные структуры данных в лоб и изобретение этих недо-DSL решает не проблему предметной области, а проблему ограниченности выразительных средств самого лиспа.archimaghttps://www.blogger.com/profile/07997791035847047137noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-40378544392204906132011-07-14T11:52:44.643+03:002011-07-14T11:52:44.643+03:00@archimag
Просто грань между форматом данных и DSL...@archimag<br />Просто грань между форматом данных и DSL размыта. Нельзя провести чёткую границу. Вот например Glade (GtkBuilder). С одной стороны это просто формат описания GUI, с другой его можно рассматривать как язык предназначенный для построения GUI.<br /><br />Эта идея хорошо прослеживается в cl-gtk2.<br />Там есть макрос let-ui позволяющий декларативно описывать GUI. Но с той разницей, что описание не интерпретируется, а транслируется в код. И это позволяет примешивать в описание GUI код на CL и наоборот.<br /><br />http://www.faqs.org/docs/artu/ch08s01.htmlandy128khttps://www.blogger.com/profile/11404034355392966133noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-89122286228588342272011-07-14T11:19:34.969+03:002011-07-14T11:19:34.969+03:00DSL не обязательно должен содержать управляющую ло...DSL не обязательно должен содержать управляющую логику, явную или неявную. Этот пример, думаю, тебе тоже знаком? http://lispm.dyndns.org/mov/dsl-in-lisp.mov<br />Концепция data-driven design и в самом деле здорово пересекается с тем, что я здесь показал. И все же это -- DSL, т.к. удовлетворяет основным критериям, выведенным М.Фаулером. Второй вариант, реализованный на Clojure, и вовсе настоящий язык программирования, т.к. в нем можно использовать языковые конструкции Clojure, в том числе и с управляющей логикой.Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-63517073949454298292011-07-14T11:01:08.444+03:002011-07-14T11:01:08.444+03:00Да я читал и RoR смотрел )) Только ведь есть разни...Да я читал и RoR смотрел )) Только ведь есть разница между "форматом данных" и DSL, или нет? В данном случае я не вижу в данном формате никакой управляющей логики. Это типичный пример data-driven.archimaghttps://www.blogger.com/profile/07997791035847047137noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-48021285517492541762011-07-14T10:47:28.461+03:002011-07-14T10:47:28.461+03:00В [1], гл.2: Domain-specific language (noun): a co...В [1], гл.2: Domain-specific language (noun): a computer programming language of limited expressiveness focused on a particular domain. <br />Ключевое слово -- "ограниченность"; DSL не должен иметь много абстрактных языковых конструкций, иначе это будет уже не DSL, а язык общего назначения. Пример реализации DSL с таким же подходом, что и мой -- в [2], стр. 149, язык реализации -- Ruby.<br />Если нет возможности найти книжки, смотри фреймворк Ruby on Rails: язык определения маршрутов и язык определения миграций. Это все очень простые DSL-ы, сильно ограниченные в своих возможностях и заточенные на решение только одной задачи.Dmitryhttps://www.blogger.com/profile/17434341697941378483noreply@blogger.comtag:blogger.com,1999:blog-4007342736133040943.post-91645933295147293862011-07-14T10:24:42.212+03:002011-07-14T10:24:42.212+03:00Да це ж не DSL, а просто data-driven. Хотя даже ещ...Да це ж не DSL, а просто data-driven. Хотя даже ещё проще. В каком-нибудь JavaScript или даже Python это можно было бы записать просто как непосредственные данные, без необходимости рассуждать о "абстрактных синтаксических деревьях". Просто Java и разные лиспы недостаточно выразительны для записи данных.archimaghttps://www.blogger.com/profile/07997791035847047137noreply@blogger.com