Pull to refresh

Comments 43

спасибо. интересно.

или проще, вывать: выЗвать
Спасибо, исправил.
Красиво и лаконично — мне нравится :)
Еще можно доклад с RubyConf посмотреть:
http://www.rubyconf2008.confreaks.com/advanced-dsls-in-ruby.html
Но это уже для углубленного изучения.
В топике я просто сделал обзор, чтобы показать возможности Ruby. Это больше для начинающих.
он становитЬся доступным
то они и вызовутЬся
но хочетЬся чтобы
который вызываетЬся
Тогда придетЬся


Во всех этих случаях мягкий знак не нужен.
Да, судя по всему я так увлекся Domain Specific Languages, что про Russian Language совсем забыл:)
Спасибо, сейчас исправлю.
Не знал что у нас есть активисты в руби бухте. А кто ещё из Российских программистов активен на rubyforge?
правильный вопрос — кто активен на гитхабе. много кто :-)
а ruby становится всё популярнее. хорошо. теперь есть что почитать =)
Нет, это уже языки разметки. Хотя формально язык разметки тоже можно назвать DSL.
В мире Ruby DSL чаще употребляется для специфического подмножества Ruby для решения какой либо задачи.
Подразумевал более конкретный вопрос — являются ли они Internal Ruby DSL? Или это просто языки разметки с ruby-like синтаксисом?
Если не ошибаюсь, то там сначало html'ная(css'ная) часть просто транслируется в строки с html тэгами, а потом через eval выполняются вставки Ruby кода.
Так что это всеже просто язык разметки с Ruby вставками, как Erb например, только со своеобразным синтаксисом.
Ну а почему же тогда не пользуются DSL вроде вашего для этих целей, а пишут шаблонные языки типа HAML?
Наподобие моего тоже есть, например Markaby(один из первых) или Erector.
Просто эти метапрограммерские хитрости достаточно медленые.
Я сравнивал свой RML с HAML, проигрыш раз в 20. Правда я оптимизацией не занимался, но все же.
Так что скорей всего причина — скорость. В веб проектах скорость отрисовки шаблона критична.
Потому что нельзя на Ruby сделать DSL столь же компактный как HAML. DSL это такая ложная серебряная пуля :)

Про скорость HAML vs Markaby, думаю, уже упоминали. Всему свое место.
Очень слабый пример DSL, даже анти-пример. Рассказали бы лучше на примере Rake.
Всмысле по ходу статьи создать Rake подобный DSL? Это было бы уже сложнее для восприятия, особенно новичками. А я именно на новичков и ориентировался, чтобы быстро и понятно продемонстрировать возможности Ruby.
Для базового обзора DSL — самое то. Хотя, конечно, упомянуть более сложные и перспективные примеры было бы только плюсом.
def String
def cool
self + " is cool!"
end
end

Ошибочка…
Я оформил ее как gem пакет, так что можно поставить так:
gem install rml
или на линуксах:
sudo gem install rml
Я один не понял этого момента?
Rubygems это менеджер пакетов для Ruby. Позволяет просто создавать, распространять и устанавливать библиотеки.
Например:
gem install mysql
Установить библиотеку для работы с mysql в локальный репозитарий.
Пакет с библиотекой(тот что устанавливается командой gem install) называется gem.
Могу написать статью про создание и использования gem'ов, если интересно.
я не об этом. я о том, что первая строка отличается от второй только наличием там sudo. и при этом, она как бы «на линуксах». а первая тогда на чем?

я к тому, что и та и другая — абсолютно идентичные команды и обе подходят как на линуксы, так и на фрибзд/макось/солярку
Чтобы установить gem в линукс нужно получить привилегии суперпользователя, если вы это делаете в в виндоус, вероятно вы и так суперпользователь :)
я не об этом. я о том, что первая строка отличается от второй только наличием там sudo. и при этом, она как бы «на линуксах». а первая тогда на чем?

я к тому, что и та и другая — абсолютно идентичные команды и обе подходят как на линуксы, так и на фрибзд/макось/солярку
Первая для Windows, а на линуксах для записи пакета в локальный репозитарий требуются права рута.
По крайней мене на Debian и Ubuntu так.
>фрибзд/макось/солярку
Да, наверное правильнее написать на *nix'ах. Хоть под маком помойму можно и без рута ставить.
Под маком тоже надо sudo. На мой взгляд, то, что для установки всяких system-wide штук нужен рутовый доступ — весьма очевидно. И указывать это отдельно — лишнее.

Таким образом, мы имеем одну команду для установки пакеты на все платформы. Даже если кому-то придет в голову запустить ее не из под рута, он получит весьма красноречивое сообщение об ошибке, которое расставит все точки на i.
Хм, когда я свитчился на линукс, меня очень раздражало в различных статьях, что для команды, которой нужны рут права, явно это не указано. Например
./configure
make
make install

Вопрос, почему бы не написать sudo make install? Новичку минут десять времени это сэкономит.
Из этих соображений я две команды и написал:) Хотя, возможно я и не прав, могу убрать.
Потому что не рутом в системе можно только бровзить одноклассников и слушать верку сердючку.

Я подозреваю, что Убунта со своей дурацкой политикой безопасности породило целое поколение людей, которым надо объяснять, перед какой командой писать sudo.

Все остальные сами соображали, что любые мало-мальские осмысленные действия над системой делаются в рутовой консоли.
>что Убунта со своей дурацкой политикой безопасности
Есть такое дело. Но у нее задача — нести Linux в массы. А простому юзеру даже и не надо знать что есть рут:)
Почему в эппл так не думают? А массовости у Мак Ос в несколько раз больше, чем у убунты.
В эппл еще как думают. Простому юзеру в Мак Ос уже не надо знать что такое рут и вообще терминал открывать.:)
А «поставить библиотеку для языка программирования» — это задача уже чуть более продвинутая, чем для простого юзера.
Я про то что Мак ОС идет в массы куда основательнее чем убунта. Но при этом убирать необходимость рута для системных операций никто не собирается. Более того, саму возможность зайти под рутом убрали, только sudo.
Ну Мак Ос же BSD юникс. А в юникс системе от рута никуда не деться…
Зато вся юниксойдность там хорошо запрятана за пользовательский интерфейс.
Просто исправьте «Линукс» на «Юникс» и добавьте, что первый вариант — для Windows, чтобы народ не нервничал ;)
Весьма интересно, спасибо. Хотя знал обо всех упомянутых возможностях Ruby, не думал о таком их использовании. Очень удобно.

Единственное замечание — по-моему, вполне можно было обойтись без расшифровки совсем уж базовых вещей типа attr_accessor: тем, кто не знаком с ними, эта статья всё равно пока не будет понятна.
Я пытался донести вкусности Ruby для не Ruby программистов. По-этому такие подробные объяснения и достаточно простой пример.
Все таки надеюсь что будет понятно:)
>>> Выше мы построили простой DSL, который является валидным Ruby кодом. Но можно отказаться от валидности. Например избавиться от точки.

Вот после этой фразы можно сделать вывод, что якобы «вкусности Ruby» для DSL и не вкусности вовсе, а корявый способ сделать то, что можно сделать проще. в скриптовых языках perl, php, python это тоже можно сделать примитивным препроцессингом и использованием конструкции типа eval.
То, что мы уходим от валидности, делает наш DSL более близким к человеческому языку и он уже становиться BNL'ом(Business Natural Language).
Тут я просто показал как можно просто перейти от DSL к BNL.
Но BNL не всегда так удобен, как DSL(особенно для программистов).
Так что «вкусности Ruby» для DSL все-таки вкусности:)
статья заинтересовала, однако не понятно, что же дальше делать с этим comp…

Кстати проследовал по ссылке на документацию к rml, там в первой строчке каламбур получился.
RML is aimed to provide valid and only valid xhtml 1.0. It‘s mean, you got exception in runtime, if try to write not valid xhtml.
Дело в том, что mean в данном случае существительное и может быть переведено как «убогий», «противный». Выходит «противно, но вы получите исключение… » =)
Думается, имелось ввиду что-то типа «That means you'll get an exception at runtime if you try to write invalid xhtml»
>That means you'll get an exception at runtime if you try to write invalid xhtml
Да, это и подразумевалось:) Спасибо, сейчас исправлю.

>что же дальше делать с этим comp…
В результате у нас получился простой язык для создания описаний. Ему можно придумать массу применений. Ну например, дописав пару методов к классу Computer мы можем, экспортировать эти описания в различные форматы.
class Computer
  def to_html; end
  def to_pdf; end
  def to_xls; end
end

А потом оформить это как небольшую консольную утилиту. Пользователь может сделать описание и экспортировать в различные форматы
conf2html my_comp.conf my_comp.html

Потом это описание в подпись на форум поставить или еще куда.
Но это просто синтетический пример для демонстрации. А вобще, DSL очень широко распространены в Ruby библиотеках. Например, тот же Rake это DSL, или как я упоминал в статье в Rails используется DSL, и тд.
Sign up to leave a comment.

Articles