LINUX.ORG.RU

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

 ,


1

3

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

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

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



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

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

Ну на самом деле если без переписывания лексера - то вполне ок делается на макросах.

А как ты не переписывая лексер сделаешь синтаксис питона (со значащими пробелами)?

у меня попытка написать #lang python сразу закрывает др.Ракет. Не встерчал такой проблемы?

Нет. Если пакет не установлен, то standard-module-name-resolver: collection not found for module path:, а если установлен (raco pkg install -n python git://github.com/pedropramos/PyonR), так всё работает.

Racket 6.1

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

reader-macros в CL - позволят и не такое

По нормальному не позволят. Тогда надо вешать set-macro-character на все символы UNICODE. А потом писать свой парсер. Иначе λ-test в питоне станет идентификатором, а должно распарситься как (- λ test)

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

А как ты не переписывая лексер сделаешь синтаксис питона (со значащими пробелами)?

Никак. Я же говорю - если можно без лексера, то можно макросами. Если лексер нужен - тут уже надо править ридер, да.

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

А можно макросом повесить set-macro-character на все символы UNICODE

Можно и не макросом. Можно функцией. Но обрабатывает примерно 100 символов в секунду. А запускать это надо при каждой компиляции.

Или можно влезть в компилятор sbcl и дописать ридер. Но это уже как раз то, про что говорил топикстартер.

monk ★★★★★
()
Ответ на: комментарий от 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 = 'London'"))
                    .to("file:target/messages/uk")
                .otherwise()
                    .to("file:target/messages/others");
    }
 
}

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

ну можешь повесить на ] закрытие ридера. ессно проверяй вложенность только

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

Не, ты не понял, смысл в том, что в CL ридер общий, а в ракетке к каждому порту (и модулю/файлу, с-но) можно привязать свой. Очень удобно. по-этому в CL, например, параллельную сборку не сделаешь.

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

я такое в своем лиспе думаю делать. но в CL вообще, это отчасти решается динамическим биндингом *readtable*

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

смысл в том, что в CL ридер общий, а в ракетке к каждому порту (и модулю/файлу, с-но) можно привязать свой.

Этим CL лучше.

Как в Racket достигается

(let ((*readtable* (select-readtable "changed")))
   (asdf:load-system :my-system))

Или даже можно внутри asdf указать на какой файл какую таблицу использовать.

А вот наоборот сделать в ракетке аналог

(enable-sql-syntax)
(define (get-data x)
  [select '(a b c) from objects where [= [a] x]])
(disable-sql-syntax)
(enble-html-syntax)
(define (make-html rows)
  [html [head] [body rows]])

уже никак.

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

Так же можно.

Действительно. Про #reader забыл.

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

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

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