LINUX.ORG.RU

[нужен совет] DSL наверное


0

0

Есть устойчивое желание создать высокоуровневый (проблемно-ориентированный) язык для спец. области.

Поясню: Есть CAD с набором «низкоуровневых» языков автоматизации (cshell, tcl, perl, python, lisp).

Они в данном случае «низкоуровневые» так как типовые действия выглядят примерно так. Например надо на всех слоях определенного типа увеличить все фигуры circle с 12мм до 16мм.

CAD_command set_layer_filter параметры слоев
CAD_command select_layers_by_filter
LAYERS=`CAD_command get_selection_list`

foreach layer ($LAYERS)
  CAD_command activate_layer $layer
  CAD_command set_object_filter type=circle size=12mm
  CAD_command select_obj_by_filter
  SELECTED=`CAD_command get_selection_list'
  if ($#SELECTED > 0) then
      CAD_command resize_selections size=16mm
  endif
  CAD_command deactivate_layer $layer
end

А хочется писать так:

foreach layers($type_of_layer) do
   CAD.resize circle from=12mm to=16mm
end

И вот такая короткая запись должна развернуться в предыдущую подробную. Вопрос как такое писать? Согласен на lisp.

Вобщем достаточно будет если подскажете литературу и ключевые слова.

★★★★★

Последнее исправление: sdio (всего исправлений: 1)

Эээ... а написать свою процедуру «CAD.resize» не катит? И насколько критично наличие литералов вида «12mm»?

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

Там в нет литералов «мм», это я так для наглядности привел.

Процедуры/функции написать не сложно, проблема, что главный файл скрипта все-равно останется перегружен языковым синтаксисом, если можно так сказать.

Т.е. на tcl надо писать

if {[layer_exist $layername]} {
  [do1 ..]
  [do2 ..]
} else {
  [do3 ..]
  [do4 ..]
}

а хочется
if exist $layername
   DO1
   DO2
else
   DO3
   DO4
endif

T.e. много лишних на данном уровне абстракции скобок. Хочется быть ближе к естеств. языку, тем более область применения достаточно узкая.

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

Ну, если тебе нужен именно свой синтаксис... сейчас лисперы тебе объяснят мощь перегрузки read-table, «и жизнь твоя не будет стоить и цента» (с).

А командный язык можно сделать на чем угодно - например, PLY, если делать на Python. Вопрос в том, какие именно языковые конструкции тебе нужны, и какие из них не в лом реализовывать.

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

tailgunner> Вопрос в том, какие именно языковые конструкции тебе нужны, и какие из них не в лом реализовывать.

минимум: простейшие структуры данных: переменная (числовая, строковая) и массив/список

управляющие структуры: ветвление (if, case/switch) и цикл (foreach, может понадобится и for/while)

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

>> сейчас лисперы тебе объяснят мощь перегрузки read-table

Что-то ты совсем растолстел в последнее время.

Подумаешь, немного иронии %) И разве добавление нового синтаксиса (не скобочного, а такого, как в стартовом посте) делается не через read-table?

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

Думаю, такое можно написать на Python/PLY за неделю по вечерам. Но, подозреваю, тебе понадобится нечто большее :)

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

Я не против лиспа, хотя если можно обойтись tcl будет лучше.

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

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

> Подумаешь, немного иронии %)

Когда ты был моложе, у тебя было больше остроумия, а это толсто же %)

И разве добавление нового синтаксиса (не скобочного, а такого,

как в стартовом посте) делается не через read-table?



Обычно оно вообще не делается. Из используемых мной библиотек только puri изменяет синтаксис и позволяет записывать объекты класс puri:uri в виде #U"http://www.linux.org.ru/".

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

>> Но, подозреваю, тебе понадобится нечто большее :)

Например?

Свои процедуры, например.

tailgunner ★★★★★
()

кстати я рассматриваю два варианта:

1. интерпретатор
клиенту передается интерпретатор и тексты на «моем языке», которые работают напрямую из САDа

2. транслятор (мой язык --> ЯП общего назначения (tcl например))
транслятор и скрипт на «моем языке» остаются у меня, а клиенту передаются сгенеренные скрипты.

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

>> Подумаешь, немного иронии %)

Когда ты был моложе, у тебя было больше остроумия, а это толсто же %)

Хм. По-моему, фраза про read-table технически совершенно корректна. Про «ни цента» - это ирония. Тонкая :D

Обычно оно вообще не делается. Из используемых мной библиотек только puri изменяет синтаксис

На мой взгляд, это всего лишь означает, что твои задачи и задача ТС сильно не совпадают («слишком много скобок»).

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

> На мой взгляд, это всего лишь означает, что твои задачи и задача

ТС сильно не совпадают («слишком много скобок»).


Хм, у нас с ним совсем разные задачи, хотя когда я писал систему шаблонов то там тоже, скобки мне были ни к чему. Просто ты совершенно зря помянул read-table применительно к этой задаче.

archimag ★★★
()

а что за «низкоуровнеый лисп» у вас и во что он раскрывается? Может просто его расширить своими процедурами?

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

pseudo-cat> Может просто его расширить своими процедурами?

Проблемы не в написании процедур как таковых, а в создании высокоуровневого сценария, чтобы почти на языке заказчика описать действия и получить готовую программу.

И самое главное — поддержка кода.

Заказчики часто просят что-то изменить, улучшить, исправить. И изначально красивый скрипт (набор скриптов) превращается в кучу накостыленного кода, а рефакторить его, как правило, влом. При наличии высокоуровневой заготовки изменения не будут приводить к перелопачиванию трудночитаемого кода (КАДовские команды могут быть и в 10 строк длиной).

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

Кстати, во втором номере fprog.ru есть интересная статья за авторством ott на в чем-то похожую тему: «Использование Scheme в разработке семейства продуктов <<Дозор-Джет>>»

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

> Т.е. на tcl надо писать

Для подобных преобразований придётся писать собственный парсер, и тут по большому счёту всё равно какой язык положить в основу. Гугли yacc, а лучши посмотри что там есть в стандартной библиотеке тикля или какой там язык у тебя используется.

А хочется писать так:

У лиспа тут есть преимущество, которое заключается в том, что можно упрятывать подобные конструкции произвольной сложности за небольшими полудекларативными выражениями. От скобочек всё равно избавиться не удастся, но количество можно сократить.

anonymous
()

Если биндится легко, то, может быть, перейти на s-выражения? Ты говоришь, что SBCL прикручен. А покажи, как выглядит сейчас программа на CL, аналогичная приведенной. Хотя бы примерно.

Zubok ★★★★★
()

Где-то в хистори у меня лежит заметка, как сделать свой DSL на питоне, путем хака токенайзера. Довольно элегантно, если надо — поищу.

*мимо-проходил

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

> Где-то в хистори у меня лежит заметка, как сделать свой DSL на питоне, путем хака токенайзера. Довольно элегантно, если надо — поищу.

Надо. Если не ТС, то мне интересно.

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

ОП, скажи что должно раскрываться и во что должно раскрываться. Ну или как ты пишешь и как хочешь писать. А то так нихрена непонятно: «Как написать дсл, вот такой не знаю какой».

anonymous
()

0) Пишешь сэмплы кода на твоём DSL

1) Изучаешь, что такое грамматика и как их писать

2) Пишишь грамматику на основе примеров из 0

3) Изучаешь, что такое парсер и как их писать. Пишешь парсер для своей грамматике. Попутно собираешь разную полезную для трансляции информацию в AST

4) Так как задач оптимизаций у тебя не стоит, то просто сразу генеришь код.

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

1) Изучаешь, что такое грамматика и как их писать

2) Пишишь грамматику на основе примеров из 0

3) Изучаешь, что такое парсер и как их писать. Пишешь парсер для своей грамматике. Попутно собираешь разную полезную для трансляции информацию в AST

Литературу с низким порогом вхождения (чтобы не сильно испугаться) подскажешь?

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

я просто не понимаю - почему не накатать этот высокоуровневый сценарий на лиспе, поднять абстракцию до слоёв и ваш пример выглядит так -

(loop for layer in layers
  (resize (circle-in layer) from to))
да и синтаксис можно сменить куда проще чем «пишем свой парсер строим AST ...»

pseudo-cat ★★★
()
Ответ на: комментарий от sdio

> Литературу с низким порогом вхождения (чтобы не сильно испугаться) подскажешь?

Что бы просто и не пугаться - рекомендую смотреть на сопроводительные материалы к разным курсам по разработке компиляторов и делать так, как там рекомендуют (плюсы - уже доступные примеры, тебе придётся делать минимум).

А вообще можешшь поискать книжки по разработке компиляторов на gen.lib.rus.ec (оно кстати ещё живое?), пробежаться по их содержанию и выбрать понравившеюся тебе. Из классики - это Aho & Alfred: Compilers, principles, techniques and tools. Если хочешь попроще - пиши (в конечном итоге задача сведётся к изучению flex/bison or haskell/parsec)

anonymous
()

> ключевые слова.

lexx/bison, если я правильно понял.

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

> gen.lib.rus.ec (оно кстати ещё живое?)

free-books.dontexist.com - зеркало.

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


 if {[layer_exist $layername]} {
   [do1 ..]
   [do2 ..]
 } else {
   [do3 ..]
   [do4 ..]
 }

Вы новичок в tcl, верно? Вызовы процедур в данном случае не нужно брать в квадратные скобки. Касательно DSL - надо иметь в виду, что в tcl нет операторов и вообще ключевых слов, есть только процедуры. if - это тоже всего лишь процедура, принимающая аргументы. Следовательно, можно написать свою процедуру, с именем, допустим, IF и синтаксисом вызова, какой взбредет в голову, например:

IF -exists $layername THEN do_1 do_2 ... do_n ELSE do_n+1 do_n+2 ... do_n+n ENDIF

остальное делается аналогично.

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

Я в своё время покурил доки к llvm, в частности небольшой туториал на пару страниц, по созданию языка и компилятора на базе llvm. Помогло расставить точки над i.

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

Вы новичок в tcl, верно? Вызовы процедур в данном случае не нужно брать в квадратные скобки.

Ну не настолько новичок, случайно скобки поставил.

if - это тоже всего лишь процедура, принимающая аргументы.

Спасибо за идею, попробую. Посмотрю что получится.

З.Ы. В течение треда склонился к желанию иметь транслятор с псевдокода (высокоуровневое описание действий), генерировать низкоуровневый скрипт и его отдавать клиенту.

sdio ★★★★★
() автор топика

Если в разработке используется Qt, тогда есть смысл обратить взор на QtScript - он уже «высокоуровневый (проблемно-ориентированный) язык» и его можно расширить проблемными объектами и функциями.

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

а зачем такие сложности когда то, что ему надо решается средствами встроенного им языка элементрано(на глаз за вечер). не обязательно лиспа, я просто знаю только как на лиспе

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

> а зачем такие сложности когда то, что ему надо решается средствами встроенного им языка элементрано(на глаз за вечер)

Почему ты спрашиваешь меня, а не ТС? Я бы обошёлся и eDSL, но sdio хочет DSL.

не обязательно лиспа, я просто знаю только как на лиспе

Аха, подобный DSL пишется на Haskell за вечер, eDSL можно красиво написать на Haskell + TH или просто на Haskell. Но какая польза от того, что я или ты знаешь, как можно решить подобную задачу? ;)

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

может я невнимательно читал, но вроде требования о DSL не было

Почему ты спрашиваешь меня, а не ТС?

потому что мне интересно что скажешь ты)

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

Топик:

[нужен совет] DSL наверное

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