При этом скобочность лиспа позволяет не писать поддержку каждого нового DSL в редакторе. Всё работает «из коробки». И манипуляции с кодом серьёзно упрощаются. Так что я бы не считал это рудиментом. Просто особенность к которой быстро привыкаешь.
Раз уж мы тут про DSL говорим, то при чём тут скобки?
Вот тебе пример из одной библиотеки которую я некоторое время назад написал. Она упрощает парсинг опций командной строки и большую часть работы делает за тебя. Прикладной код выглядит так:
(defmain main ((debug "Show traceback instead of short message."
:flag t)
(log "Filename to write log to.")
(token "GitHub personal access token."
:env-var "TOKEN")
&rest repositories)
"Utility to analyze github forks."
;; Making real work
(loop for repository in repositories
do (analyze repository
:log log
:debug debug
:token token)))
Всё, что ты видишь до строчки Making real work, это DSL для описания функции, принимающей параметры командной строки. Под капотом оно разворачивается в такой вот код:
(progn
(net.didierverna.clon:defsynopsis (:postfix "REPOSITORY")
(defmain/defmain::text :contents "Utility to analyze github forks.")
(defmain/defmain::flag :long-name "help" :env-var nil :description
"Show help on this program." :short-name "h")
(defmain/defmain::flag :long-name "debug" :env-var nil :description
"Show traceback instead of short message." :short-name "d")
(defmain/defmain::stropt :long-name "log" :env-var nil :description
"Filename to write log to." :short-name "l")
(defmain/defmain::stropt :long-name "token" :env-var "TOKEN" :description
"GitHub personal access token." :short-name "t"))
(defun main (&rest defmain/defmain::argv)
(net.didierverna.clon:make-context :cmdline
(cons "cl-info" defmain/defmain::argv))
(let ((repository (net.didierverna.clon:remainder))
(net.didierverna.clon:help
(net.didierverna.clon:getopt :long-name "help"))
(debug (net.didierverna.clon:getopt :long-name "debug"))
(log (net.didierverna.clon:getopt :long-name "log"))
(token (net.didierverna.clon:getopt :long-name "token")))
(when net.didierverna.clon:help
(net.didierverna.clon:help)
(uiop/image:quit 1))
(handler-bind ((t
(lambda (condition)
(uiop/image:print-condition-backtrace condition :stream
*error-output*)
(uiop/image:quit 1))))
(loop for reporitory in (remainder)
do (analyze repository :log log :debug debug :token token))))))
Тут видно, как задаются возможные аргументы, какие у них могут быть флаги и короткие названия, как запускается парсинг аргументов и их значения присваиваются переменным внутри функции.
Абстракция defmain, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.
В результате у программистов на других языках лапшекод, который надо будет через год полностью переписать, а у программистов на Lisp лаконично сформулированная бизнеслогика, которую легко читать и поддерживать.
Проверил. Да, по HTTP. Но ведь если параноить, то надо параноить по полной – вычитывать весь код всех своих opensource зависимостей и их зависимостей, и зависимостей их зависимостей.
А почему не стали использовать формат reStructured Text? Он хотя и более странно выглядит, чем Маркдаун, но стандартизирован, и для описания документации лучше походит, так как задумывался именно с этой целью.
В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.
Крутецкая получилась система. Хотел бы такую на свой дом водрузить. Однако, из целей экономии такую систему ставить нецелесообразно — окупаться будет десятки лет.
А вот если б действительно были частые перебои или электричества нехватало, то тогда да.
Про то, как оно внутри устроено, был предыдущий пост и может быть будет следующий.
Я прекрасно понимаю, что тут аудитория больше техническая, но так и ведь и сервис он для разработчиков. Именно поэтому тут я затрагиваю вопросы про продукт, ведь ответить на них могут только пользователи — разработчики. Глупо было бы такую тему поднимать на мегамозге, где только менеджеры тусят.
Вячеслав, этот пост менее технический, но не рекламный. Просто он более менеджерский и продуктовый. Хорошо, что голосование идет, но жаль что комментариев мало. Мне и правда очень хочется комментариев по делу, про то, как улучшить сервис.
Что касается больее технических постов, то спрашивайте, про что рассказать и обязаельно про это будет отдельный пост.
Да, верю. Какой смысл заниматься тем, во что не веришь?
Про RSS конечно думал. Правда странно, что мало кто его хочет. Но кажется, что добавить его будет совсем не сложно, и это будет еще один способ доставки наряду с email, вебхуками и интеграцией со Slack.
Peleactrum, я сейчас читаю книгу «Антихрупкость» Нассима Талеба. После неё начинаешь совсем иначе относиться к вероятностям. Очень рекомендую, она того стоит.
Кстати, в этой книге тоже приводится эмпическое правило, касающееся принятия решений. Звучит оно так: «Если в списке «за» есть больше одного пункта — не делайте этого, ибо это означает, что вы пытаетесь себя убедить в том, что вам это нужно.»
Разумно. Но где ты почитаешь о том что вышло в новых версиях? Я имею в виду, есть ли у тебя идеи, как разделить срочную и несрочную информацию в рамках AllMyChanges?
Я вот не до конца понял, при чем здесь SDK на node.js и чего вы так все на него возбудились. Сказано же — битбакет ходит в расширения по HTTP а значит там на стороне расширения может быть всё что угодно, хоть bash за Apache в CGI.
Раз уж мы тут про DSL говорим, то при чём тут скобки?
Вот тебе пример из одной библиотеки которую я некоторое время назад написал. Она упрощает парсинг опций командной строки и большую часть работы делает за тебя. Прикладной код выглядит так:
Всё, что ты видишь до строчки
Making real work, это DSL для описания функции, принимающей параметры командной строки. Под капотом оно разворачивается в такой вот код:Тут видно, как задаются возможные аргументы, какие у них могут быть флаги и короткие названия, как запускается парсинг аргументов и их значения присваиваются переменным внутри функции.
Абстракция defmain, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.
Такой вот DSL. Реальный.
Кстати, opensource хорош тем, что его можно исправлять. Пока завёл issue про https: github.com/quicklisp/quicklisp-client/issues/167
В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.
А вот если б действительно были частые перебои или электричества нехватало, то тогда да.
10 лет назад я так же в Яндекс попал. Тупо поисковая реклама в красивой обертке. И больше ничего.
Я прекрасно понимаю, что тут аудитория больше техническая, но так и ведь и сервис он для разработчиков. Именно поэтому тут я затрагиваю вопросы про продукт, ведь ответить на них могут только пользователи — разработчики. Глупо было бы такую тему поднимать на мегамозге, где только менеджеры тусят.
Что касается больее технических постов, то спрашивайте, про что рассказать и обязаельно про это будет отдельный пост.
И добавил.
allmychanges.com/p/web/allmychanges/#0.29.0
Про RSS конечно думал. Правда странно, что мало кто его хочет. Но кажется, что добавить его будет совсем не сложно, и это будет еще один способ доставки наряду с email, вебхуками и интеграцией со Slack.
Кстати, в этой книге тоже приводится эмпическое правило, касающееся принятия решений. Звучит оно так: «Если в списке «за» есть больше одного пункта — не делайте этого, ибо это означает, что вы пытаетесь себя убедить в том, что вам это нужно.»