Pull to refresh
32
Александр Артёменко@Svetlyak

Пользователь

27
Subscribers
Send message
Да, ответ отличный. Спасибо за ссылку!
При этом скобочность лиспа позволяет не писать поддержку каждого нового 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, написанная один раз, сама задаёт разумные дефолты и избавляет меня от написания или копирования всего этого бойлерплейта в каждой программе.


Такой вот DSL. Реальный.

В результате у программистов на других языках лапшекод, который надо будет через год полностью переписать, а у программистов на Lisp лаконично сформулированная бизнеслогика, которую легко читать и поддерживать.
Проверил. Да, по HTTP. Но ведь если параноить, то надо параноить по полной – вычитывать весь код всех своих opensource зависимостей и их зависимостей, и зависимостей их зависимостей.

Кстати, opensource хорош тем, что его можно исправлять. Пока завёл issue про https: github.com/quicklisp/quicklisp-client/issues/167
А почему не стали использовать формат reStructured Text? Он хотя и более странно выглядит, чем Маркдаун, но стандартизирован, и для описания документации лучше походит, так как задумывался именно с этой целью.

В reStructured Text заложены возможности для расширения и то как это делается, тоже стандартизировано, в отличии от Markdown, где разработчик каждой библиотеки городит свой велосипед.
Хорошую зарплату в основном дают не за хорошую соображалку, а за ответственность и инициативность.
Крутецкая получилась система. Хотел бы такую на свой дом водрузить. Однако, из целей экономии такую систему ставить нецелесообразно — окупаться будет десятки лет.

А вот если б действительно были частые перебои или электричества нехватало, то тогда да.
И что все так эрегируют на слово «google»? Идея то не первой, не второй, и даже не третей свежести.

10 лет назад я так же в Яндекс попал. Тупо поисковая реклама в красивой обертке. И больше ничего.
А, точно. Спасибо, буду знать!
Не нашел ссылки на оригинальный пост. А вот он.
Про то, как оно внутри устроено, был предыдущий пост и может быть будет следующий.

Я прекрасно понимаю, что тут аудитория больше техническая, но так и ведь и сервис он для разработчиков. Именно поэтому тут я затрагиваю вопросы про продукт, ведь ответить на них могут только пользователи — разработчики. Глупо было бы такую тему поднимать на мегамозге, где только менеджеры тусят.
Вячеслав, этот пост менее технический, но не рекламный. Просто он более менеджерский и продуктовый. Хорошо, что голосование идет, но жаль что комментариев мало. Мне и правда очень хочется комментариев по делу, про то, как улучшить сервис.

Что касается больее технических постов, то спрашивайте, про что рассказать и обязаельно про это будет отдельный пост.
Максим, я таки добавил сегодня RSS фиды: allmychanges.com/p/web/allmychanges/#0.29.0
Денис, спасибо за толчек в нужном направлении. Я решил, что раз уж встал в такую рань, то надо всё-таки добавить поддержку RSS.

И добавил.

allmychanges.com/p/web/allmychanges/#0.29.0
Да, верю. Какой смысл заниматься тем, во что не веришь?

Про RSS конечно думал. Правда странно, что мало кто его хочет. Но кажется, что добавить его будет совсем не сложно, и это будет еще один способ доставки наряду с email, вебхуками и интеграцией со Slack.
Peleactrum, я сейчас читаю книгу «Антихрупкость» Нассима Талеба. После неё начинаешь совсем иначе относиться к вероятностям. Очень рекомендую, она того стоит.

Кстати, в этой книге тоже приводится эмпическое правило, касающееся принятия решений. Звучит оно так: «Если в списке «за» есть больше одного пункта — не делайте этого, ибо это означает, что вы пытаетесь себя убедить в том, что вам это нужно.»
Хмм. Ладно, посмотрим, будет ли у кого-то еще подобное пожелание.
Разумно. Но где ты почитаешь о том что вышло в новых версиях? Я имею в виду, есть ли у тебя идеи, как разделить срочную и несрочную информацию в рамках AllMyChanges?
Я вот не до конца понял, при чем здесь SDK на node.js и чего вы так все на него возбудились. Сказано же — битбакет ходит в расширения по HTTP а значит там на стороне расширения может быть всё что угодно, хоть bash за Apache в CGI.

Information

Rating
7,271-st
Location
Россия
Works in
Registered
Activity