Что лучше для DSL: TCL или Lisp? Что вы можете сказать о привязке Java(C#)-TCL по сравнению с Lisp(Scheme)? Какой инструмент DSL применим для разработки .Net? (кроме инструментов Microsoft DSL)
Что лучше для DSL: TCL или Lisp?
Ответы (8)
Если вам нужен легкий доступ к JVM, вы можете использовать Clojure.
Обратите внимание, что вы можете спроектировать DSL так, как хотите, вы не обязаны пропускать какой-либо «шепелявый» синтаксис. Мой любимый пример — в стандарте Common Lisp: расширенный синтаксис LOOP настолько неуклюж, насколько это вообще возможно, и на самом деле это DSL для циклов, реализованный в макросе.
Если выбирать между TCL и LISP, я бы каждый раз выбирал TCL. Отчасти потому, что я знаком с TCL, а отчасти потому, что легко расширить TCL своими собственными командами и встроить его в другое программное обеспечение.
Для взаимодействия с JAVA у вас есть jacl и tclblend. http://tcljava.sourceforge.net/ является хорошей отправной точкой для этих пакетов или http://www.tcl.tk/ для всего, что связано с TCLish.
Я бы пошел со схемой :)
Как уже было сказано, вам не нужно представлять DSL как шепелявый код.
Вот пример того, как я написал LINQ 'DSL' для схемы R6RS. (но ты должен это знать! только сейчас увидел твой ник ;P)
Также здесь — второе воплощение.
Глядя на примеры внизу, видно, что за исключением выражений (которые должны быть Scheme), ввод почти идентичен LINQ в C#.
Для DSL в .Net Boo — отличное место для начала. Парни из Unity3D используют его для своего языка сценариев «JavaScript», я думаю, что даже Second Life создают свой LindonScript2.0 или что-то в этом роде, и я думаю, что этот парень Айенде (для него Google) выпускает книгу об этом. эти времена...
Это действительно зависит от того, кто будет использовать DSL. Если вы ожидаете экспертов, не связанных с ИТ, то рекомендуется что-то простое и понятное, например TCL. Объяснение радостей LISP не выпускнику ИТ было бы серьезной проблемой, как и отладка большой программы LISP, написанной кем-то, кто не разбирался в LISP.
В равной степени объяснять кому-то, что b = a + 1 пишется как B = INCR(A), тоже не очень хорошая идея.
Я бы порекомендовал Python, вы можете встроить специфичный для предметной области код в один или два специализированных класса. У вас есть язык, на котором пользователи, не являющиеся ИТ-специалистами, могут писать простые читаемые программы и на котором нет ограничений на то, что может кодировать ИТ-специалист.
loop
в Common Lisp, который является очень простым DSL для циклов.
- person Svante; 25.11.2008
Я бы выбрал TCL вместо Lisp в любое время, если речь идет о более широкой цели для вашего приложения. Люди, скорее всего, захотят обработать свои мысли, а не списки. :) (Спасибо, Lisp, за то, что дал мне представление о функциональном программировании, но я не думаю, что мы должны больше видеться, о, и кстати, это не ты, это я ;))
В дополнение к этому, я должен добавить, что если у вас нет веской причины (т. е. например, легкости или очень специфических потребностей DSL), Python или Javascript должны быть расширением язык в современном мире ИМХО.
пс. поскольку речь идет о .NET, IronPython — это версия Python, которую вы лучше как.
Посетите блог Мартина Фаулера. Это то, что заставило меня начать с DSL. Fluent Interfaces — это своего рода DSL.
У Ayende, известной благодаря RhinoMocks, выходит книга
Вот один из моих Внешний DSL примеры, которые я написал для C#. И вот что я написал в Лисп.
Нет опыта работы с TCL или JAVA для написания DSL.
Даже в Lisp, кажется, есть некоторые странные команды, такие как CDR (если вы не исходите из языка, не ориентированного на LIST), в TCL есть некоторые «странные» вещи. Вы должны учитывать, какой синтаксис больше всего подходит вашему мозгу.
например если у вас нет проблем с очень разреженным синтаксисом и назначением переменных с набором, который использует TCL, и вам нужен более богатый, очень мощный синтаксис с большим количеством возможностей метапрограммирования, и вы не возражаете заключить все в круглые скобки и всегда начинать с оператор типа (+ 2 3) (а не 2 + 3), то вам следует выбрать LISP.