LINUX.ORG.RU

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

 ,


1

3

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

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

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



Последнее исправление: terminator-101 (всего исправлений: 4)
Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.