LINUX.ORG.RU
Ответ на: комментарий от mv

> Кстати, на чём ещё можно так легко и просто написать пачку DSL'ей, как на CL?

На Ruby, Io, Tcl.

geekless ★★
()
Ответ на: комментарий от cathode

«Научные круги» на 99.9% состоят из тех кому нужны численные методы, формулируемые в терминах императивных языков. Из этих «99.9» чуть меньше чем все используют готовые продукты, специализированные в конкретной области.

Что означает, что эти 99.9% можно не учитывать. Остаются специалисты в computer science, среди которых Haskell действительно гораздо более популярен.

Miguel ★★★★★
()
Ответ на: комментарий от mv

А на что оно тогда тратит время?

Загляни в Haskell-café, узнаешь.

Miguel ★★★★★
()
Ответ на: комментарий от mv

Common Lisp в освоении проще C++

Э... нет. C++ тоже не сахар, но случаев, когда принципиально разные вещи выглядят в нём одинаково, всё-таки гораздо меньше.

Miguel ★★★★★
()
Ответ на: комментарий от mv

Кстати, на чём ещё можно так легко и просто написать пачку DSL'ей, как на CL?

На Haskell. Там это один из основных подходов.

Miguel ★★★★★
()
Ответ на: комментарий от mv

> У тебя точно комплекс.

да нет, просто поднадоело переливание из пустого в порожнее, трепа насчет лиспа на ЛОРе полно, лучше бы код на лиспе обсуждали - всем бы было интересней

Кстати, на чём ещё можно так легко и просто написать пачку DSL'ей, как на CL?


я же говорю фетиш - на лиспе можно «легко и просто написать пачку DSL'ей», значит нужно выпячивать это и писать DSL на каждый чих, да - это возможно интересно, я сам сейчас присматриваюсь к MPS, но опять же - в реальной жизни не нужен DSL на каждую задачу, гораздо важней иметь уже готовый инструмент, который умеет все что надо, уже оттестирован и тебе надо просто им воспользоваться, и плевать что это «убогий» PL/SQL или JS, например, или какая-то сторонняя библиотека на, стыдно сказать, С++ - они уже есть, они уже работают

aho
()
Ответ на: комментарий от Miguel

>> Что означает, что эти 99.9% можно не учитывать. Остаются специалисты в computer science, среди которых Haskell действительно гораздо более популярен.

Если не учитывать 0 целых 0 десятых фанбоев от Хацкеля, то его какбэ вообще не видно.

cathode
()
Ответ на: комментарий от mv

>> А при чём здесь язык?

На нем писать вообще-то надо...

cathode
()
Ответ на: комментарий от cathode

Если не учитывать 0 целых 0 десятых фанбоев от Хацкеля, то его какбэ вообще не видно.

Разуй глаза.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

> На Haskell. Там это один из основных подходов.

Только на хацкеле у тебя получатся интерпретаторы DSLей, а на CL - компиляторы.

anonymous
()
Ответ на: комментарий от aho

> в реальной жизни не нужен DSL на каждую задачу

Ну как это «не нужен»? Задачи то все разные, значит и идеальный для каждой задачи язык по определению разный.

anonymous
()
Ответ на: комментарий от anonymous

Только на хацкеле у тебя получатся интерпретаторы DSLей

??? Это почему это? Нормальные EDSL спокойно компилируются.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

> Приведи, пожалуйста, несколько примеров неудачных, просто для сравнения.

Для начала: угребищные скобочки, списки, точечные пары, динамическая типизация.

anonymous
()
Ответ на: комментарий от anonymous

> Ну как это «не нужен»? Задачи то все разные, значит и идеальный для каждой задачи язык по определению разный.

создание, поддержка, развитие и изучение языка под каждую отдельную задачу - конечно заманчивая перспектива, но думаю не все ее оценят

aho
()
Ответ на: комментарий от aho

> создание, поддержка, развитие и изучение языка под каждую отдельную задачу - конечно заманчивая перспектива, но думаю не все ее оценят

Разработчик и так де-факто каждый раз создаёт новый язык, составляя словарь понятий предметной области и реализуя их в виде классов, методов и т.п. Вопрос стоит в том, чтобы сделать создание этого языка и выражение мыслей на нём максимально удобным. Когда, чтобы выразить простую мысль в терминах предметной области, приходится продираться сквозь дебри синтаксиса ЯП и его искусственных ограничений... — нахрена нужен такой язык вообще?

geekless ★★
()
Ответ на: комментарий от mv

На скале. Нормальную дсл, а не лисп-лайк.

И вообще на любом языке возьму генераторы парсеров(написать свой под свой язык тоже можно левой пяткой) и сделаю дсл, используя все достижения компиляторостроения:)

arhibot
()
Ответ на: комментарий от geekless

> Когда, чтобы выразить простую мысль в терминах предметной области, приходится продираться сквозь дебри синтаксиса ЯП и его искусственных ограничений... — нахрена нужен такой язык вообще?

затем, что за «дебрями синтаксиса ЯП» стоит универсальность, совместимость и стандарты, может самому писать DSL и интересно, но пользоваться чужими, разными для всех задач, и расширять их под себя - отнюдь

aho
()
Ответ на: комментарий от geekless

Вопрос стоит в том, чтобы сделать создание этого языка и выражение мыслей на нём максимально удобным

Нахуа? Достаточно удобным, а не максимально удобным. А то это уже дрочерство получается.

dizza ★★★★★
()
Ответ на: комментарий от anonymous

>«Нормальных» - это таких, на которых легко делаются элементарные вещи, вроде анафорических лямбд или пандорического захвата.
Анафорический when на clj:

(defmacro awhen [cond & body]
  `(let [~'it ~cond]
         (when ~'it
           ~@body)))
Следовательно, вы либо намеренно лжете, либо не разбираетесь в теме. В любом случае, мне с вами больше не о чем говорить.

unlog1c ★★★
()
Ответ на: комментарий от aho

> может самому писать DSL и интересно, но пользоваться чужими, разными для всех задач, и расширять их под себя - отнюдь

Вы не в состоянии осознать, что любая библиотека — по своей сути DSL для своей предметной области? Если вы программируете, вы уже по факту пользуетесь ими, «чужими, разными для всех задач». Разница лишь в том, делать это нормально или через жопу.

за «дебрями синтаксиса ЯП» стоит универсальность, совместимость и стандарты

Получилась красивая, но бессодержательная фраза. Универсальность чего, совместимость с чем и стандарты на что?

geekless ★★
()
Ответ на: комментарий от dizza

>> Вопрос стоит в том, чтобы сделать создание этого языка и выражение мыслей на нём максимально удобным

Нахуа? Достаточно удобным, а не максимально удобным. А то это уже дрочерство получается.

Нахуа? Максимально удобным, а не достаточно удобным. А это это уже нищебродство получается.

tailgunner ★★★★★
()
Ответ на: комментарий от dizza

> Нахуа? Достаточно удобным, а не максимально удобным. А то это уже дрочерство получается.

Ок, достаточно удобным. Дело в том, что сами знаете какие языки — не _достаточно_ удобны для.

geekless ★★
()
Ответ на: комментарий от geekless

> Вы не в состоянии осознать, что любая библиотека — по своей

сути DSL для своей предметной области?


Такими заявлениями вы полностью обесцениваете само понятие DSL. Однако оно имеет ценность. Но как и любую другую мощную концепцию её не стоит применять для всего подряд.

archimag ★★★
()
Ответ на: комментарий от archimag

> Такими заявлениями вы полностью обесцениваете само понятие DSL. Однако оно имеет ценность. Но как и любую другую мощную концепцию её не стоит применять для всего подряд.

В случае расширяемых языков нет жесткой границы между библиотекой и DSL.

Rake — это уже DSL или еще библиотека для Ruby? Tk — библиотека виджетов или DSL на основе Tcl для построения интрефейсов?

geekless ★★
()
Ответ на: комментарий от archimag

>> Вы не в состоянии осознать, что любая библиотека — по своей сути DSL для своей предметной области?

Такими заявлениями вы полностью обесцениваете само понятие DSL.

Ну почему же «обесцениваете»... просто ставит понятие «DSL» на причитающееся ему место.

tailgunner ★★★★★
()
Ответ на: комментарий от aho

создание, поддержка, развитие и изучение языка под каждую отдельную задачу - конечно заманчивая перспектива, но думаю не все ее оценят

Создание, поддержка, развитие и изучение библиотеки под каждую отдельную задачу - конечно, заманчивая перспектива, но, думаю, не все её оценят.

Miguel ★★★★★
()
Ответ на: комментарий от unlog1c

> http://img807.imageshack.us/i/ezi.jpg/

Это фигня, попытка использовать длинные (т.е. нормальные, в примере таких нет) имена функций + плюс использование имён пакетов (вместо :use) приводят к тому, что надо тратить много усилий для сохранения какой-либо читаемости кода.

archimag ★★★
()
Ответ на: комментарий от unlog1c

http://img807.imageshack.us/i/ezi.jpg/

Кстати, очень показательно. Лиспер видит массу однородного текста. Нелиспер видит по крайней мере что-то подсвеченное, с некоей структурой, но испоганенное скобочками.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

> Лиспер видит массу однородного текста.

Только не лиспер, а автор изображения, там же написано «What I see».

archimag ★★★
()
Ответ на: комментарий от provaton

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

Я поддерживаю лиспом базу firebird. Это удобно именно из-за особенностей лиспа: символы (каждой хрпр соответствует символ), макросы (опредеение хрпр - это макрос на лиспе, типа

(def-stored-procedure edit_lock_unlock_all
 :doc "!Сообщает другим подключениям о снятии всех блокировок"
 :args '((ref_user_session int "если null, то текущая"))
 :body (fbody
if (ref_user_session is null) then 
  select txt from get_session_variable('REF_USER_SESSION') into :ref_user_session; 
delete from edit_lock where ref_user_session=:ref_user_session;
^))
), поиск определений объектов базы данных средствами лиспа (7-10 строк и емакс этому научился). Интерактивность SQL хорошо стыкуется с интерактивностью среды лиспа, компиляция хрпр чере C-c C-c (compile defun).

Исправление ошибок на лету очень помогает. Например, у меня есть конвертер БД, который работает 3 часа. Если бы не возможность выкрутиться из ошибок, я бы отлаживал его до сих пор, или его пришлось бы разбивать на части и организовывать внешнее хранение состояния.

Макросы для предметной области. Я не пользуюсь пафосным словом DSL. Если кому-то нужен новый язык, то, видимо, старый чем-то не устраивает. Меня лисп устраивает, поэтому просто доращиваю его макросами вида def-table (определение таблицы), def-view (представления), with-rebuilding-database (пересборка объектов на сервере с контролем зависимостей) и т.п.

Кроме того, я использую небольшие «макросы», которые можно вставлять в SQL-код. Пример использования:

>fse distinct M_начало_месяца(doc_date) from document;
Здесь M_начало_месяца определено так:
(def-firebird-macro-1 M_начало_месяца (date-expr) 
  (fbody dateadd(day,1-extract(day from ~~date-expr),~~date-expr)^))
Эти «макросы» я тоже создаю интерактивно и нахожу это удобным.

Я пользуюсь также Delphi. Delphi - это строго типизированный, статически компилируемый язык. Я не могу представить себе подобную среду для работы с СУБД в рамках чистого Delphi, ведь там при каждом изменении программы требуется, как минимум, её останов и пересборка. Т.е., в данном случае, преимущества динамической среды как бы очевидны. Ни один другой известный мне язык не даёт таких же возможностей, как CL.

Есть IBExpert, написанный на Delphi. Он лучше понимает внутренности Firebird и может в некоторых аспектах больше, чем моя среда. Например, он хорошо показывает планы запросов и делает анализ производительности. Однако, его встроенный интерпретатор IBEBlock падал у меня на простейших примерах, после чего я и оставил попытки его использовать.

Поэтому, с моей точки зрения, IBExpert не является полноценной _программной_ средой для работы с СУБД. А у меня такая среда есть и не то, чтобы я надорвался при её создании. IBExpert - это лучший пример программы для работы с Firebird, написанный на Delphi. Имеем налицо победу динамического подхода над статическим.

den73 ★★★★★
()
Ответ на: комментарий от Miguel

ВНЕЗАПНО я вижу, как минимум, структуру на indent'ах. ВНЕЗАПНО в Хаскелле исключительно форматирование структуру и формирует. Мне нужны скобки чтобы явно видеть где заканчивается блок и IDE расставила отступы за меня.

unlog1c ★★★
()
Ответ на: комментарий от aho

> создание, поддержка, развитие и изучение языка под каждую отдельную задачу

задача совершенно тривиальная и тупая. API умное придумать намного сложнее.

anonymous
()
Ответ на: комментарий от unlog1c

ВНЕЗАПНО я вижу, как минимум, структуру на indent'ах.

А, ну да. Правда, в картинке нелиспера она тоже есть.

ВНЕЗАПНО в Хаскелле исключительно форматирование структуру и формирует.

Это ложь.

Miguel ★★★★★
()
Ответ на: комментарий от geekless

Разница лишь в том, делать это нормально или через жопу.

возьмем пример - нужно отрисовать PDF поверх окна gtk, очень условно говоря с помощью библиотек это пишется так:

GString str = GString_new( "Hello World" );
Window wnd( str );
wnd.show();

FString path ( "file.pdf" );
File    file ( path );
MemBuf  buf  ( file.ReadAll() );

Poppler pl  ( buf.get() );
Cairo   cr  ( wnd );

pl.Draw( cr );

ничего сложного - все очевидно; а теперь покажи как это запишется через DSL, как ты это видишь, ну что GString, File, Window, FString, MemBuf, Poppler, Cairo - все разные DSL, т.е. как именно это все будет выглядеть поверх все-равно так необходимого универсального ЯП( чтоб DSL вообще можно было связывать между собой )

aho
()
Ответ на: комментарий от anonymous

> задача совершенно тривиальная и тупая. API умное придумать намного сложнее.

ну если DSL уровня «Hello World» или просто дублирование API - то да, а если это действительно новый ЯП, а не что-то реализуемое даже на препроцессоре С, то задача явно становится сложнее

aho
()
Ответ на: комментарий от Miguel

> Создание, поддержка, развитие и изучение библиотеки под каждую отдельную задачу - конечно, заманчивая перспектива, но, думаю, не все её оценят.

можешь тоже написать вариант отрисовки PDF через DSL

aho
()

Вброшу на тему статической vs динамической типизации.

    var foo = { 
        toString: function () { 
            return 5; 
        }, 
        valueOf: function () { 
            return "foo"; 
        } 
    }; 
    alert(foo.toString() + 1); // 6 (bad!) 
    alert(foo + 1);            // "foo1" (no good!) 
    alert(+foo);               // NaN (the worst!)
geekless ★★
()
Ответ на: комментарий от mv

А на что оно тогда тратит время? Пишет на планету очередную статью про монады и трансформеры?

в том числе. а ещё отвечает на вопросы новичков, патчит библиотеки, пишет новые, и вообще всячески занимается облегчением жизни программиста

jtootf ★★★★★
()
Ответ на: комментарий от aho

нужно отрисовать PDF поверх окна gtk, очень условно говоря с помощью библиотек это пишется так

ничего сложного - все очевидно

Капитан, ты?

т.е. как именно это все будет выглядеть поверх все-равно так необходимого универсального ЯП( чтоб DSL вообще можно было связывать между собой )

Ты полагаешь, что если такая формулировка ставит в тупик тебя, то она поставит меня? Расширяй кругозор, начни с Ruby, например. Для начала, можешь попытаться ответить на простой вопрос: является ли программа на Rake программой на Ruby. Затем можно переходить к более сложному: является ли код, исполняющийся в man n interp, программой на Tcl.

Именно тот факт, что любой код на специализированном DSL, созданном на расширяемом языке, является одновременно и кодом на самом этот языке, и делает языки, подобные, скажем, Лиспам, Io или Ruby, такими мощными. (Хотя в скобках заметим, что в отдельных случаях язык можно не только расширять, но и урезать. Например, в том же man n interp.)

а теперь покажи как это запишется через DSL, как ты это видишь, ну что GString, File, Window, FString, MemBuf, Poppler, Cairo - все разные DSL

Если для определённости взять некий ruby-подобный псевдокод, то эта лапша будет выглядеть где-то так:

wnd = Window.new("Hello World")
pl = Poppler.new(IO.read("file.pdf"))
wnd.show
pl.draw_on wnd.cairo_context
geekless ★★
()
Ответ на: комментарий от provaton

> Еще один школьник, не разобравшийся чем динамическая типизация отличается от нестрогой.

Еще один неадекват, лишенный чувства юмора.

geekless ★★
()
Ответ на: комментарий от geekless

> Если для определённости взять некий ruby-подобный псевдокод, то эта лапша будет выглядеть где-то так:

То есть не отличимо от кода, который привел лестер.

tailgunner ★★★★★
()
Ответ на: комментарий от geekless

>> То есть не отличимо от кода, который привел лестер.

Что ты этим хотел сказать

То, что ты привел такой же код на универсальном языке, пользующийся библиотеками. Где там DSL?

кто такой лестер?

aho

tailgunner ★★★★★
()
Ответ на: комментарий от aho

возьмем пример - нужно отрисовать PDF поверх окна gtk

Тривиальней пример нельзя было выбрать? Ты б еще б хелло ворлд рассмотрел бы.

provaton ★★★★★
()
Ответ на: комментарий от tailgunner

> То, что ты привел такой же код на универсальном языке, пользующийся библиотеками. Где там DSL?

Ты тоже не в состоянии осознать, что программа на Rake является программой на Ruby?

Ну напиши равный по выразительности аналог Rake-а на... какой же язык взять, чтоб никого не обидеть... ну пусть будет Java.

Я могу гнуть язык как угодно под задачу, но он всё равно останется тем же самым языком. Я так понял, ваша претензия в том, что видимый синтаксис остаётся без изменений? Так там и нечему изменяться: и в лиспах, и в Ruby, и в Io, и в Tcl синтаксис как таковой практически отсутствует. А вам что, хотелось увидеть, как у ЯП вырастут рога и хвост?

geekless ★★
()
Ответ на: комментарий от geekless

> А вам что, хотелось увидеть

Нам бы хотелось увидеть DSL, К.О.

archimag ★★★
()
Ответ на: комментарий от geekless

> Ты полагаешь, что если такая формулировка ставит в тупик тебя, то она поставит меня? Расширяй кругозор

Если для определённости взять некий ruby-подобный псевдокод, то эта лапша будет выглядеть где-то так:


замечательно конечно, вот только это не набор DSL, ты оказывается просто неуч, нет - может конечно лично для тебя DSL это что-то вроде макросов или тех же библиотек, но на самом деле DSL - это ЯП, как, например, тот же PL/SQL, ЯП со своим синтаксисом, своей лексикой, и хрен ты вот так просто напишешь:

wnd = Window.new(«Hello World»)
DROP TABLE T2
cursor = SELECT * from T1
wnd.title = cursor.f1.value

без указания какой именно DSL тебе нужен

aho
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.