Size: a a a

Rust — русскоговорящее сообществo

2020 September 02

H

Hirrolot in Rust — русскоговорящее сообществo
Hirrolot
Мне нужно в syn закодировать такой синтаксис:

a, b, c, ..

Или

a, b, c,

Или

a, b, c

Т.е. список чего-то, возможно с запятой на конце, или список с trailing comma и с ..

С текущим вариантом проблема в том, что он пропускает a, b, c ..

Или просто забить и оставить как есть?
Но почему-то не работает

Видимо он идентификатор в списке ожидает, что логично
источник

V

Vladimir in Rust — русскоговорящее сообществo
folex
Хочу использовать макросы раста для парсинга. Есть ли способ как-нибудь загрузить содержимое файла, и проинтерпретировать его как макрос?

А-ля my_macro!(include_str!("my_file"))
ну ты можешь файл открыть прям в процедурном макросе, от туда и вызвать какой-то парсер (у syn должно api быть для этого)
А в декларативном по идее нельзя.
источник

f

folex in Rust — русскоговорящее сообществo
Vladimir
ну ты можешь файл открыть прям в процедурном макросе, от туда и вызвать какой-то парсер (у syn должно api быть для этого)
А в декларативном по идее нельзя.
Спасибо!
источник

f

folex in Rust — русскоговорящее сообществo
Моя цель – парсить текстовый DSL, проверяя что там сходятся типы, и потом его интерпретировать
источник

f

folex in Rust — русскоговорящее сообществo
Может для этого есть какие-то инструменты получше чем макросы?
источник

V

Vladimir in Rust — русскоговорящее сообществo
Та вроде нет. Тут скорее вопрос где ты хочешь это все интерпретировать и запускать, может - это тебе надо в рантайме. Так что наверное зависит от специфики DSL
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
folex
Может для этого есть какие-то инструменты получше чем макросы?
Да. Это называется "интерпретация". Она состоит из лексического/синтаксического разбора и далее прямой интерпретации полученного AST, либо компиляции в байткод, и его интерпретации/выполнения на ВМ.

Для разбора есть комбинаторы парсеров (Nom) и несколько генераторов парсеров.

Написать интерпретатор AST на Rust руками — плёвое дело. Простой компилятор в стековый байткод — тоже.

Для проверки типов удобно брать логические движки. Либо какую-нибудь реализацию Prolog, которые тоже есть на Rust, либо один из пары альтернативных. Но можно тоже руками написать, в зависимости от сложности системы типов.
источник

f

folex in Rust — русскоговорящее сообществo
Alexander Tchitchigin
Да. Это называется "интерпретация". Она состоит из лексического/синтаксического разбора и далее прямой интерпретации полученного AST, либо компиляции в байткод, и его интерпретации/выполнения на ВМ.

Для разбора есть комбинаторы парсеров (Nom) и несколько генераторов парсеров.

Написать интерпретатор AST на Rust руками — плёвое дело. Простой компилятор в стековый байткод — тоже.

Для проверки типов удобно брать логические движки. Либо какую-нибудь реализацию Prolog, которые тоже есть на Rust, либо один из пары альтернативных. Но можно тоже руками написать, в зависимости от сложности системы типов.
Спасибо! Если помнишь какие-то примеры реализаций типизации на подобных движках, можешь кинуться ссылочками? Если не сложно :)
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
folex
Спасибо! Если помнишь какие-то примеры реализаций типизации на подобных движках, можешь кинуться ссылочками? Если не сложно :)
Если "подобные движки" — это "логическое программирование", то такое делается на коленке в два счёта. Например, так: https://gist.github.com/gabriel-fallen/5027a387ca75f595c03404c31d76ce86
Тут некоторые пояснения: https://www.youtube.com/playlist?list=PL-vT8sV0teWg_nSJHfN31a0Sr_hsRdahI
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
Вообще, в Интернете должно быть полно тьюториалов типа "тайпчекер на Prolog/miniKanren/etc." Потму что это реально просто. Вместе с унификацией и выводом типов.
источник

f

folex in Rust — русскоговорящее сообществo
Буду гуглить, спасибо за направление и ссылки! :)
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
folex
Буду гуглить, спасибо за направление и ссылки! :)
У Вас там какая система типов? А то, может, проще руками написать?
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
Логический движок даёт из коробки унификацию (первого порядка) и поиск с откатами. Если ни того, ни другого для проверки типов не требуется — проще на Rust руками на матчах закодить.
источник

f

folex in Rust — русскоговорящее сообществo
Alexander Tchitchigin
У Вас там какая система типов? А то, может, проще руками написать?
Хороший вопрос! Но пока что я не знаю ответа, тк и язык, и интерпретатор существуют только в виде нечёткой идеи :)

Я думал про что-то такое
aqua!(
   (free-vars module-id distributor)
   (steps
       (call distributor (wasm has-local-module) module-id)
       (if (not (call distributor (wasm pin) module-id)) terminate)
       (call distributor (wasm start-providing) module-id)
       terminate
   )
);

или такое

aqua!(
   (free-vars module-id distributor)
   ((and
       (call distributor (wasm has-local-module) module-id)
       (and
           (if (not (call distributor (wasm pin) module-id)) terminate)
           (and
               (call distributor (wasm start-providing) module-id)
               terminate
           )
       )
   ))
);
источник

f

folex in Rust — русскоговорящее сообществo
ну, это когда я думал про раст макросы, конечно
источник

AT

Alexander Tchitchigi... in Rust — русскоговорящее сообществo
В принципе, даже сравнительно продвинутый bidirectional type checking без особых проблем руками пишется...
источник

f

folex in Rust — русскоговорящее сообществo
(не уверен, может это уже оффтопик)
источник

PP

Pavel Pisligin in Rust — русскоговорящее сообществo
Всем привет
Кто-нибудь может плз подсказать, есть ли человеческий способ мержа джсонов в расте?
источник

K

Kitsu in Rust — русскоговорящее сообществo
Pavel Pisligin
Всем привет
Кто-нибудь может плз подсказать, есть ли человеческий способ мержа джсонов в расте?
раскрой мысль, получить объединение нескольких схем?
источник

PP

Pavel Pisligin in Rust — русскоговорящее сообществo
{ "A": 1 }
+
{"B": "privet":}
=
{"A": 1, "B": "privet"}
источник