LINUX.ORG.RU

Расширение синтаксиса

 ,


1

3

Сейчас принято расширять синтаксис, в основном, с помощью макросов. Но макросистемы достаточно сложны, и требуют времени на изучение. Между тем, можно же расширять синтаксис путем непосредственного изменения исполнителя. Если дело касается совместной разработки, макросы еще, возможно имеют какой-то смысл. Но в других случаях их применение, как мне кажется, совершенно не обоснованно.

Зачем, например, мне, изучать макросистемы, если я пишу код один? Не проще ли мне писать мини-язык под задачу, и расширять его по мере надобности путем изменения самого исполнителя?

К тому же, синтаксис этот становится куда более сладким и органичным. А язык — несравненно более гибкий и мощный. Любой каприз без каких-либо ограничений.



Последнее исправление: terminator-101 (всего исправлений: 4)
Ответ на: комментарий от terminator-101

Ты действительно считаешь, что проще свой миниязык? Ну тогда язык будет сильно ограниченным, если его интерпретатор писать проще, чем макрос.

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

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

Ну почему же? Берём L++ для примера. Получаем скорость C++ (что невозможно на чистом Lisp/Scheme), но при этом возможность доопределять синтаксис так, как нравится.

Если скобки не нравятся, то можно вспомнить Groovy. На базе которого делаются вполне симпатичные DSL, запускаемые из Java. И, опять же, без особых ограничений

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

язык будет сильно ограниченным

На самом деле, это заблуждение. Как правило, чем проще язык, тем он мощней. Обилие фич вместе с усложнением накладывают массу ограничений.

terminator-101
() автор топика
Ответ на: комментарий от terminator-101

Кроме того, любая фича source-языка будет работать и в target-языке, если мы этого хотим. Это вообще не вопрос.

Это если у тебя макросы. Если самописный интерпретатор - то не будет.

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

Твой язык не умеет не то что в векторы, но даже флоаты. Вперед, расширяй минимальную парашу до уровня, на котором аналог BLAS писать не стыдно.

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

Берём L++ для примера. Получаем скорость C++ (что невозможно на чистом Lisp/Scheme),

Который интерпретируется ракетой... Хм... Что-то тут не так. :) Да и в самом L++ очень даже встречается define-syntax.

Groovy. На базе которого делаются вполне симпатичные DSL

Ну и где эти DSL? Точнее, сколько разных DSL на груви можно сделать и насколько сильно расширять?

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

Насчет форта — хз, но, конкретно, CL и Racket — это не простые языки. Могут с плюсами запросто потягаться в уродстве и неконсистентности дизайна. Простые — это, например, смоллток, селф (особенно), в какой-то степени (в плане синтаксиса) scheme R<6RS. Попсовые же лиспы спроектированы так, чтобы быть понятными быдлу, но не концептуально простыми.

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

Только странное - быдло их не понимает. То ли IT совсем скатилась, то ли ошибочка вышла, не для быдла делали.

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

Твой язык не умеет не то что в векторы, но даже флоаты.

Ошибка. Запомните: «Не уметь в Гугл», но «Не уметь во векторы»!

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

Не понимает, потому что в массе не стремится. Отталкивает синтаксис, в основном, а от практического освоения толку мало, потому и не идет в массы. С точки зрения семантики, они максимально приближены к алгол-стайл-языкам. Сравни, например с lisp-3, или даже Interlisp. Это день и ночь. Лисп изначально был экстремально динамичным языком. Очень медленным и очень выразительным.

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

Нет, я, в данном случае, про метациклический интерпретатор, если рассматривать простой случай.

terminator-101
() автор топика
Ответ на: комментарий от turtle_bazon

Который интерпретируется ракетой

Зачем интерпретируется? Компилируется g++ и запускается.

Да и в самом L++ очень даже встречается define-syntax.

Так я же говорю, DSL. Расширяемый. Но раскрывается не в ракетку, а в C++.

Ну и где эти DSL? Точнее, сколько разных DSL на груви можно сделать и насколько сильно расширять?

http://www.slideshare.net/glaforge/going-to-mars-with-groovy-domainspecific-l...

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

Розенталь устарел, в Лурку не умеешь?

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

Если честно, этот DSL для робота не впечатлил.

Сделай скидку, что это Java, а не Lisp. Суть в том, что исполнитель и его синтаксис описывается на Java, а синтаксис самого исполнителя (Groovy) существенно отличается.

Кстати, бывает DSL и на чистом Java:

public class MyRouteBuilder extends RouteBuilder {
 
    /**
     * Let's configure the Camel routing rules using Java code...
     */
    public void configure() {
 
        // here is a sample which processes the input files
        // (leaving them in place - see the 'noop' flag)
        // then performs content based routing on the message using XPath
        from("file:src/data?noop=true")
            .choice()
                .when(xpath("/person/city = &#39;London&#39;"))
                    .to("file:target/messages/uk")
                .otherwise()
                    .to("file:target/messages/others");
    }
 
}

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

Видел DSL'и разные на груви и на ява. К сожалению, приходится делать скидку. :)

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