Pull to refresh

Comments 69

Эту чушь уже где-то постили раньше… А, да, вот, нашел https://habr.com/ru/post/248147/


Похоже, что вы не сделали выводов из сильно отрицательного рейтинга прошлого аккаунта, не так ли?

Почему из-за несогласия с мнением человека люди считают приемлемым использовать механизм, изначально созданный для избавления от токсичности, а не для подавления инакомыслия? И почему нравится этим бравировать?

Потому что проблема этого автора — вовсе не в "инакомыслии".

Проблема в том, что автор:


  1. врёт про достоинства своего формата;
  2. умалчивает достоинства других форматов;
  3. при указании ему на ошибки продолжает повторять их в следующих постах;
  4. всех достал уже своим фреймворком.
Это и похоже на несогласие с мнением.

И судя по средней заплюсованности его статей, включая ту, на которую ссылался mwizard — нет, не достал :)
Хотел было вставить карикатуру про 14 конкурирующих стандартов, потом подумал, что её и так вспомнит любой, кто зашел почитать эту статью. Автору, к слову, тоже неплохо бы вспомнить.
UFO just landed and posted this here
Заголовок статьи напомнил слова, что по уверениям профессора Джона Рональда Руэла, были высечены тёмным наречием на кольце всевластья в известной истории. Один из главнейших смыслов этой истории в испытании, имя которой по моей версии (стыренной в москва-сити) — «тест на Гитлера».

Как и Вернадскому, мне кажется разумным утверждение что идеи приходят в наш мир разом в множество голов способных улавливать их еле-уловимое звучание. В 2014 меня так же, как и многих терзали мысли о годном реактивном контейнере данных. Всякие кефиры и RX до сих пор выглядят как кнопочные телефоны. Атом автора статьи ещё тогда оказался точной реализацей того как я слышал звучание этой идеи. Но даже такую простую частичку не было возможности подтянуть в свой проект, не понятно как. А всё остальное до сих пор остаётся ещё более не понятным и значит не нужным.

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

Вселенная $mol имеет в себе массу полезных и настоящих идей, за которые сражаюсь в текущем мире, но может оказаться открывая портал добавляя в проекте импорты $mol, орков прибудет больше чем эльфов. С тёмным наречьем шутки плохи, особенно не зная контекста.

Как мне кажется сравнивать похоже полноценный DSL от $mol с JSON не очень корректно, как и с YAML. Принижая других, лучше не стать. Почему нет дружбы с другими форматами/библиотеками, как и самой вселенной $mol в npm репозитриях?
Все остальные должны умереть?

Всё те же самые ошибки, которые ещё в прошлой статье были...


  1. Хранение сырых бинарных данных в Data Node противоречит пункту об удобочитаемости и отсутствии экранирования.


  2. Как XML, так и JSON на самом деле поддерживают поточную обработку. Наличие поточной обработки — это вообще фича парсера, а не формата. То же самое с позициями.


  3. В AST откуда-то взялся type, хотя ранее утверждалось, что никаких типов нод в Tree нету.


UFO just landed and posted this here

Ну так если бинарные данные не для удобочитаемости, то как бинарные данные и удобочитаемость совмещаются в формате tree?

Дмитрий, еще немного и у вас совсем не останется виртуалов.

Чего только люди ни выдумывают, только бы лисп не учить.
Мелко плаваете, чего тут пишите сразу свой язык! Благо уже WebAssembly завезли :))
Проблема форматов хранения AST, основанных на текстах, — в том, что в нём нет послойного отображения (например, при первом взгляде можно было бы исключить типы данных), ну, и упомянутое выше хранение бинарных данных. Проблема бинарных AST — в том, что к ним надо дописать кучу утилит с нуля просто, чтобы кое-как начать работать.
В результате вагончик не едет ни туда, ни сюда.

Приведёте пример послойного отображения?

The *.pyi files are used by PyCharm and other development tools to provide more information, such as PEP 484 type hints, than it is able to glean from introspection of extension types and methods. They are not intended to be imported, executed or used for any other purpose other than providing info to the tools. If you don't use use a tool that makes use of .pyi files then you can safely ignore this file.

See: www.python.org/dev/peps/pep-0484 www.jetbrains.com/help/pycharm/2016.1/type-hinting-in-pycharm.html
stackoverflow.com/a/55055248

Заголовочные файлы и файлы деклараций (*.d.ts) также можно рассматривать как отдельные слои.

А какой смысл прятать информацию о типах?

1. Первое ознакомление с новым кодом.
2. Делать частичные дифы, где будет представлена только часть информации (как уже сейчас многие интерфейсы предлагают игнорировать изменения в пробельных символах).
3. Больше кода вмещается на один экран (или на один столбик экрана) — легче перемещаться по коду.
И пр. и пр.

С тем же успехом можно и параметры функций скрывать и инициализацию переменных вырезать.

Да, типы я привёл как характерный пример, по которому архитекторы разных языков могут принимать диаметрально противоположные решения. Но ключевой момент не в том, можно добавить типы или нет, а в том, что [новая] система позволит быть гибче в интеграции расширений языка, не боясь переусложнить синтаксис последнего.
UFO just landed and posted this here
Связные списки — это решение частной проблемы с одновременным усложнением задачи масштабирования. Если уж на то пошло, то надо сразу либо делать индекс, либо использовать tarantool/прочую дб
UFO just landed and posted this here
Я, разумеется, против ссылок ничего не имею. Я про то, что связный список — лишь частный случай формата хранения данных. Могут понадобиться и хеш-таблицы, и разной сложности деревья, и ещё и с блокировками, чтобы несколько человек могли редактировать )))
Автору БОЛЬШОЕ СПАСИБО за проделанный анализ и предложенный формат!
Формат Tree понравился.
Попробую применить на практике.

Тут подсказывают, что есть похожий проект — Tree Notation. Он выглядит взрослее. Хотя сам этот формат на мой взгляд не очень, так как не разделяет структуру и данные.

Так и не понял как можно хранить бинарные данные и не иметь экранирования переноса строки и начальных индентов.

Бинарные данные нарезаются на куски по переносам строк и вставляются как есть в виде узлов данных.

Если бы я делал такой формат для себя, то сделал бы аналогичными виды «a \b» и «a: b».
Указанная РБНФ/grammar.tree формата Tree не отображает структуры данных, задаваемых форматом. По этой нотации данные необходимо рассматривать как список строк, а не дерево.

Да, лексически это не более, чем список строк, состоящих из отступа, списка имён и сырых данных. Для синтаксического анализа нужна уже не хитрая логика с подсчётом числа отступов. Это если и можно отразить в BNF, то сложно, и имеет мало смысла.

Текстовый формат это тоже не более, чем список строк и не более, чем список символов, и что?
Не обязательно выражать БНФ абсолютно точно, но это всё равно будет лучше, чем выражать его так ложно. Можно и расширить БНФ специальный понятием, позволяющим выразить всё как надо.

Вы всё же путаете лексический и синтаксический анализ. Результатом первого является именно что плоский поток токенов языка. Делается это для упрощения синтаксического анализа.

Почему Вы решили, что я путаю? (Р)БНФ у Вас задаёт вовсе не лексический уровень, а синтаксический, но неправильный

У Меня он всё же задаёт именно лексический уровень.

Не похоже на правду, тем более что Вы сами написали
напишем полную формальную грамматику
Вы или придумали свои определения для известных терминов, либо меняете показания на лету
Вы или придумали свои определения для известных терминов, либо меняете показания на лету

И вы всё ещё спрашиваете за что ему карму сливали? Он ведь каждый раз так делает...

Если Вы, как и я, считаете, что он не прав, это ещё не повод сливать карму. В споре рождается истина.
И таким образом вы можете легко рефакторить любые языки, основанные на tree формате, без поиска для каждого языка отдельного парсера и разбирательства с тем, как у него происходит работа с AST.
Есть программа на неком языке, в которой указанный в примере auth не только объявлен, но и упоминается в некотором контексте, а, возможно, что он ещё и не уникален по имени, но уникален по контексту. Каким образом представленный механизм позволит легко это изменить?

На языке jack.tree такая трансформация может выглядеть так:


hack google
    hack auth credentials from
    clone from

То есть матчимся на контекст (google), клонируем его как есть, но добавляем вложенный хак, который уже матчится на auth и заменяет его на credentials. На JS всё то же самое, только кода чуть больше:


return config.list(
    config.hack({
        google: ( google, belt )=> [
            google.clone(
                google.hack({
                    auth: ( auth, belt )=> [
                        auth.struct( 'credentials',
                            auth.hack( belt )
                        ),
                    ],
                }),
            ),
        ],
    }),
)
Не пойму, как это решает задачу рефакторинга подобного кода, но выраженного через Tree:

type Google = { auth string }
a: Google
a.auth = "Bam"

Я так понимаю вы про семантический рефакторинг? Он, очевидно, на уровне AST не возможен.

Тогда что означает
И таким образом вы можете легко рефакторить любые языки, основанные на tree формате, без поиска для каждого языка отдельного парсера
если отдельный парсер такую возможность даёт?

И отдельный парсер такой возможности не даёт. Это даёт тайпчекер и то лишь для языков со статической типизацией.

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

Этим занимается семантический анализатор. Впрочем, терминологические споры мне не интересны. Можете хоть компилировать на этапе парсинга — суть процесса от этого не поменяется.

Так Вы ответите на вопрос?

Какой смысл в Вашем рефакторинге, который не решает задач рефакторинга? Как в анекдоте — зато дёшево ж?

Вы говорите, что терминологический спор Вас не интересует, но, по факту, этот диалог в значительной степени вокруг этого и строится. Типичный парсер для многих языков требует для своей работы анализа объявлений и нет никакого смысла выкидывать эту часть для того, чтобы сделать это потом в отдельном семантическом анализаторе.
В такой форме запрос распарсить — плёвое дело, в отличие от настоящего SQL.
А если ненастоящий, а только то подмножество, что достаточно для разбора таких запросов? Не подменяете ли Вы понятия?

Такое подмножество уменьшит и выразительную мощность. В sql.tree выразительная мощность может быть даже больше.

Почему уменьшит?
Tree никак не решает проблему проверки корректности составленной конструкции и следовательно разбор выражения делать всё равно придётся и его нельзя сводить к «дерево уже построено»

Потому что "подмножество", а не "надмножество", как в случае с sql.tree.


Такую проверку для AST написать существенно проще, чем сделать то же самое для sql как текста.

Потому что «подмножество», а не «надмножество»
Не вижу связи

Такую проверку для AST
Насколько? У Вас есть полный парсер для SQL-подобного языка, но выраженного через tree?
Если нет, то и говорить по существу не о чем. Для сравнения подходов Вы сослались на то, для чего у Вас нет аналога

Небольшой апдейт по теме


tree.hyoo.ru — песочница, где можно погонять различные трансформации. Вот несколько примеров:


  • view.tree ⇒ view.ts — трансляция описания компонент в код на TypeScript.
  • view.tree ⇒ locale.json — экспорт референсных текстов для локализации в виде JSON из описания компонент.
  • view.tree ⇒ view.dts — экспорт TypeScript типов со встроенными сорсмапами из описания компонент.
  • JSON ⇒ json.tree — трансляция JSON в json.tree.
  • xml.tree ⇒ XML — трансляция xml.tree в XML
  • js.tree ⇒ JS — трансляция JavaScript AST в собственно JavaScript.
  • wasm.tree ⇒ WASM — компиляция WASM AST в WASM бинарник и проверка его корректности. Эта штука пока ещё сильно сырая: поддерживаются лишь 3 типа секций, нельзя тут же в песочнице его запустить. Но как будет время докурю спецификацию.
  • jack.tree ⇒ JS eval — трансляция мета-языка с генерацией JavaScript со встроенными сорсмапами и тут же его исполнение.
  • MarkedText ⇒ JS — трансляция MarkedText в код JavaScript со встроенными сорсмапами, который генерирует DOM дерево, используя DOM API.
  • grammar.tree check — проверка корректности grammar.tree описания синтаксиса налету.
  • span.tree imprint/reuse — зашивание исходников и маппинга в span.tree дерево, его промежуточная сериализация в строку, с последующим восстановлением исходного дерева без потери маппинга.
  • automate.tree (JS) — пример написания собственной трансформации на JavaScript, преобразующей простой скрипт автоматизации в код на JavaScript со встроенными сорсмапами.
  • automate.tree (jack) — то же самое, но используя язык jack.tree.

Фух, надеюсь нигде со ссылками не наврал. mayorovp поправит, если что.

Хотелось бы видеть XML ⇒ xml.tree. Предвидится такое?
А где же удобный переключатель? :)

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

И «undexpected» — это ошибка в выводе ошибок :)

Двусторонние трансформации — большая редкость.


Можно пример на чём ломается?

Двусторонние трансформации — большая редкость.
Не для изоморфных представлений.
Можно пример на чём ломается?
Подозреваю, что Вы уже нашли на чём, так как теперь работает сносно, а в первый раз ломалось почти на всём

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

Почему же он тогда исходный пример переводил?
От ПО с мистикой надо бежать, что есть сил :)
Sign up to leave a comment.

Articles