LINUX.ORG.RU

Короче: где ещё есть macro characters?

 , , , ,


1

4

Я пытался спросить это же в своей прошлой теме, но вышло слишком замудрёно. Поэтому спрашиваю прямо. В каких языках ещё есть

set-macro-character, как в CL, и где оно сделано хорошо (не хуже, а желательно лучше, чем в CL)?

Для тех, кто не успел поставить часы, технология описана в этой статье, искать «макросы чтения».

★★★★★

Макросистема.. Это основная отличительная особенность Common Lisp.. Позволяет программировать компилятор языка.

Только компилятор не языка, а AST. Язык в лисп не завезли

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

Только компилятор не языка, а AST. Язык в лисп не завезли

Да и компилятор есть не всегда ;-)

anonymous
()

Куда уж лучше то.

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

Я, конечно, мало что понял из твоих ссылок, но мне кажется, там речь о макросах, а не на макро-буквах. С помощью макро-букв можно сделать, к примеру, такое:

> (set-macro-character #\^ (lambda (stream char) (reverse (read-line stream))))

> ^a " b

"b \" a"
Здесь мы говорим, что если в исходнике попалась буква ^, нужно читать все буквы до конца строки, перевернуть считанное и вставить её в читаемый объект на то место, где встретилась ^. Можно, естественно, вместо такой шалости вставить нормальный лексер любого синтаксиса.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)

Есть еще quotations в F#. Не совсем макросы, но близко. Можно получить AST по заданному выражению F# и дальше работать с этим AST.

Обн. А, тебе именно macro character? Даже не знаю, где это есть, кроме CL.

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от den73

Если так ставить условие то да, макро-символы подходят только к языкам без синтаксиса, т.е. к лиспу. В нормальных языках код с «пользовательским синтаксисом» должен так или иначе отделяться от нормального кода.

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

Я не знаю о макро-символах в других языках. Может в perl или tcl что-то такое есть, я бы не удивился.

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

Не забывай давать определения, если уж не даешь пруфы.

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

В отношении анонимуса идентичность установить невозможно, поэтому слово «этот» неприменимо. Мне не важно, кто даст пруфлинк.

Пока пруфлинка нету. Что ж, это уникальная фича лиспа, что ли?

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

Не нужен ещё один недолисп. Нужны качественные реализации и библиотеки.

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

Я верно понял, что он списан с CL и в нём есть расширения:

  • special comments - что-нибудь для автодока и вообще аннотации
  • режим чтения кода и режим чтения данных (исходники/конфиги)
  • #reader (правда, я не вижу здесь новой конструкции именно на уровне читателя).

Больше я ничего не упустил?

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

Смотри на Katahdin.

Угу, интересненько. Записал в трекер проекта.

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

Обн. А, тебе именно macro character? Даже не знаю, где это есть, кроме CL.

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

quantum-troll ★★★★★
()

OCaml - camlp4:

  let module Html5 = Eliom_content.Html5.F in
  <:html5< <div>xyz</div> >>


, Haskell - quasiquotation:

   [$xmlQQ|
   <{url}:{elem} {attrNs}:{attrName}={attrValue} attr="cool">
     <elem ns1:elem1="1" ns2:elem2="2"><<elemCont>></elem>
     <elem />
     <el />
     <<cont1>>
     <<cont2>>
   </{url}:{elem}>
   |]

. Не совсем аналоги, но близко.

Laz ★★★★★
()

В каких языках ещё есть

В forth есть всё. Там можно забабахать свой парсер кода и прикрутить его вместо стандартного, но по удобству именно добавления макросимвола с CL, конечно, не сравнить.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Laz

camlp4 очень похож. В Хаскеле между | | - многострочная строчка, которая парсится пользовательским кодом, или это так случайно с синтаксисом Хаскеля совпало?

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

При компиляции quasiquote [abc|xyz|] наш код abc получает строку xyz и возвращает что-то типа хаскелёвого ast (я сам не особо углублялся в тему, только пользовался, так что без подробностей). Народ использует их для многострочных литералов и интерполяции строк, парсит JSON и генерит XML, строит графики в R. При компиляции, да.

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

Так вот почему она тормозит!

Кстати, латышские друзья из Mikrotik, похоже тоже фанаты reader macro:

[yoba@MikroTik] > global f do={ :put "HELLO" } 
[yoba@MikroTik] > put $f 
;(eval (eval /putmessage=HELLO))
makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от den73

Больше я ничего не упустил?

Обработчиком символа в таблице чтения в Racket может быть не функция, а таблица чтения.

В синтаксическом режиме чтения аргументы функции чтения (ch port src line col pos), то есть кроме символа и потока ввода есть источник текста и координаты в источнике. Это позволяет делать нормальные сообщения об ошибках, если в синтаксисе есть ошибка.

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

Разумеется есть.

Судя по документации, треды в Factor только кооперативные.

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

Ну что, грохот-вымогательство в этом отношении годно сделан.

А есть ли в Racket возможность научить IDE использовать тот же самый лексер и раскрашивать текст с его помощью? Это входит в мои планы, но нужно переделывать код лексера-парсера на отсутствующие в CL корутины и я пока не хочу в это ввязываться - задача не самая приоритетная и не самая простая.

В лиспе src обычно достаётся из потока (хотя способ зависит от реализации), а вот для получения line и pos приходится шаманить. Особенно доставляют разделители строк, зависимые от платформы. Тем не менее, у меня есть работающие решения этих вопросов.

Однако тема близится к итогу: макросы чтения есть во всех элитарных языках, есть откуда что стащить.

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

А есть ли в Racket возможность научить IDE использовать тот же самый лексер и раскрашивать текст с его помощью?

DrRacket его и так использует. И в Racket GUI есть поддержка: http://docs.racket-lang.org/syntax-color/

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