Aleksei (astynax)
Приоритеты расставляются после разбора, а не во время
Aleksei (astynax)
Потому как приоритеты и фиксити кастомных операторов парсер не волнуют
Aleksei (astynax)
А :: - это часть синтаксиса. Как скобки, например.
Aleksei (astynax)
Какой приоритет у ( или у =? :)
Алексей ayaye :)
это были структуры данных транслятора - индексы во всяких таблицах. иногда инты путались и было больно.
но эпик был, когда при переносе на другую платформу выяснилось, что в функции, которая возвращала тип выражения (индекс в таблице типов), был пропущен return. и всё компилировалось и работало. просто индекс по счастливой случайности вычислялся в регистре, через который потом возвращалось значение.
Ilya
Aleksei (astynax)
Местная аннотация типов делается ДО разбора выражений на какие-то там $ и почее.
Ilya
скобками на = в любом случае воздействовать нельзя, а на :: можно. Раз скобки изменяют выражение, значит можно говорить о приоритете
Aleksei (astynax)
Тут нет никакого -1
Aleksei (astynax)
Это приоритет парсинга
Aleksei (astynax)
А не приоритет применения, который у $ равен 0
Ilya
Aleksei (astynax)
Зачем это (приоритеты парсера и приоритеты применения функций) смешивать вообще?
Ilya
значит его приоритет ниже, чем у $
Aleksei (astynax)
Да блин, "жираф выше, чем крокодил длиннее"
Aleksei (astynax)
И то и другое в метрах же!
Ilya
Aleksei (astynax)
нет
Aleksei (astynax)
Потому как полиморфизм
Ilya
1 + 2 * 3 могут давать разные AST в зависимости от приоритета, разве нет?
Aleksei (astynax)
У парсера нет информации о приортетах ещё
Ilya
или в корне будет стоять (+), или (*), в зависимости от
Aleksei (astynax)
Смысл будет разный. А вот будут ли разные AST - не факт
Aleksei (astynax)
Надо спросить у гуру :)
Aleksei (astynax)
Парсер ничего не знает о том, что такое *
Ilya
что такое AST тогда? если у 1 + 2 * 3 он не зависит от приоритета операторов. О каком дереве мы вообще говорим тогда?
Aleksei (astynax)
AST cинтаксис Haskell описывает. А не семантику
Aleksei (astynax)
Скобки - синтаксис. Приоритет кастомных операторов - семантика
Ilya
ну вот тогда интересно посмотреть, в какое AST парсится 1 + 2 * 3
Aleksei (astynax)
А что здесь 1 и +?
Aleksei (astynax)
Int, или, скажем, Hour?
Aleksei (astynax)
Инстансы Num будут разные
Aleksei (astynax)
А если Num вообще скрыть и перегрузить + локально?
Aleksei (astynax)
Это сколько же проходов парсера должно быть, чтобы понять, как парсить конкретное выражение?
Aleksei (astynax)
Нужно распарсить - и "выполнить" - импорты. Потом тайпчекнуть всё, чтобы понять типы элементов выражения. Потом найти инстансы, предоставляющие конкретные версии операторов, если тайпклассы участвуют. И только потом строить AST выражения. Так что ли?
Ilya
не знаю, я всегда думал, что приоритет операторов влияет на итоговое AST, возможно в Haskell это действительно не так
Aleksei (astynax)
Призываются знатоки :)
Ilya
@znatoky
Ilya
Евгений
Надо лезть в код и понимать в какой момент infixr'ы всякие применяются.
Можно эксперимент поставить (у кого компилятор под рукой) -- составить нетипизирующуюся конструкцию с двумя самописными операциями, сделать им одинаковый приоритет. Если раньше ругнётся тайпчекер, то значит AST разбирается без информации об операторах, если ругнётся на приоритет -- значит приоритет играет синтаксическую роль
Aleksei (astynax)
https://stackoverflow.com/questions/29185467/parsing-with-user-defined-operator-precedence
adam
Надо лезть в язык и понимать в какой момент семантика зацикленных грамматик применяется.
Можно эксперимент поставить (у кого словарь под рукой) -- составить нетипизирующуюся конструкцию с двумя самописными операциями, сделать им одинаковый приоритет. Если раньше ругнётся пространство, то значит прослойка разбирается без информации об операторах, если ругнётся на приоритет -- значит приоритет играет синтаксическую роль
Aleksei (astynax)
> Infix operators are parsed as if they were all left-associative. The renamer uses the fixity declarations to re-associate the syntax tree.
Aleksei (astynax)
Aleksei (astynax)
Так что я был и прав, и лев: парсеру пофиг на приоритеты, но AST - итоговое - будет разное :)
Ilya
Alexander
Так, ребята, экзистенциальный вопрос. Функция - это структура данных?
Ilya
$ cat foo.hs
infixr 4 ##
(##) :: Int -> Int -> Int
(##) = undefined
infixl 4 %%
(%%) :: Int -> Int -> Int
(%%) = undefined
$ ghci foo.hs
λ> 1 ## 2 %% "foo"
<interactive>:1:1: error:
Precedence parsing error
cannot mix ‘##’ [infixr 4] and ‘%%’ [infixl 4] in the same infix expression
λ> 1 ## (2 %% "foo")
<interactive>:2:12: error:
• Couldn't match expected type ‘Int’ with actual type ‘[Char]’
• In the second argument of ‘(%%)’, namely ‘"foo"’
In the second argument of ‘(##)’, namely ‘(2 %% "foo")’
In the expression: 1 ## (2 %% "foo")
Ilya
смотри ка, @astynax, на приоритеты ругается раньше типизации
Aleksei (astynax)
Главное, что это уже после парсинга делается :)
Евгений
Ну, судя по всему парсинг двухстадийный
Евгений
Но стадии идут непрерывно
Aleksei (astynax)
> Sometimes the over-generous parsing is only dealt with by the renamer.
Vladimir
Aleksei (astynax)
Alexander
А морфизм - не структура данных?
Ilya
Alexander
Хеш можно взять от чего угодно первоклассного
Alexander
А еще от чего угодно, находящегося в памяти
Vladimir
Ilya
Алексей ayaye :)
а что такое структура данных?
Alexander
Ilya
Ilya
вот он, грязный язык во всей своей красе
Vladimir
а правильный ответ - 42
Aleksei (astynax)
Alexander
Alexander
И даже не так. Нужно же по хешу доставать лямбду, а как его узнать? Ну пусть она везде в программе идет кортежем вместе со своим хешом
Aleksei (astynax)
Можно. Но сам факт хэшируемости функций - странный. Тем более что в питоне есть id - идентификатор объекта
Alexander
Короче, ерунда получается
Ilya
Ilya
тоже тогда подумал, что придётся же таскать везде хэш
Ilya
ну когда-то это может быть полезно, например для имитиации switch-case
Alexander
dict[lambda x:.. : ]?
Cheese
Alexander
Видимо, правильное решение было бы таким. Кладем лямбду в кортеж вместе с уникальным индексом, например, guid (или заворачиваем в другую лямбду, возвращающую guid + первую, что эквивалентно). Хеш от этого индекса и будет хешом лямбды. Но придется таскать индекс с собой везде
IC