Aleksei (astynax)
Есть ещё вариант "какие-то-там (тут вроде бы топоним) скобки", но я его не помню :(
Алексей ayaye :)
Aleksei (astynax)
В контексте хаскеля разве что "квазицитирование" ещё встречал
Aleksei (astynax)
Aleksei (astynax)
Вроде как получить AST вне TH нельзя
Aleksei (astynax)
Только если парсить исходник заново
Aleksei (astynax)
А точно не получится обойтись комбинатором?
Алексей ayaye :)
ну не обязательно зацикливаться на AST. может быть другой способ есть
Aleksei (astynax)
комбинатор запилить нельзя?
f (Pat1 a) = ...
f (Pat2 b) | True = ...
f _ = ...
-- переделываем в
mkF g _ _ (Pat1 a) = g a
mkF _ h _ (Pat2 b) | True = h b
mkF _ _ def _ = def
-- и потом используем
f = mkF id id "foo"
Aleksei (astynax)
Если паттерны сложные, но сама конструкция матчинга применима более двух раз, то комбинатор должен подойти
Aleksei (astynax)
Если "тел" много, то можно record с функциями сделать
Алексей ayaye :)
Aleksei (astynax)
если тела более-менее отличаются, то да
Aleksei (astynax)
Если функций много, то можно и рекорд сделать
data F = F
{ handlePat1 :: a -> c
, handlePat2 :: b -> c
, default :: c }
use :: F -> _ -> c
use f (Pat1 a) = handlePat1 f a
...
Aleksei (astynax)
В данном случае значения типа F будут разными "функциями" с одинаковым механизмом разбора входного значения
Vladislav
Aleksei (astynax)
Да, точно "оксфордские скобки"! Спасибо :)
Алексей ayaye :)
Cheese
а UnicodeSyntax разрешает использовать ⟦ ⟧ вместо составных скобок?
Alexander
а как правильно парсить штуки, которые зависят от того, что будет дальше, вот прочитал я токен, а чтобы понять, что он такое мне нужно распарсить дальше
Dmitry
В несколько проходов
Dmitry
Вычислять новое АСТ по результатам частичной интерпретации
Dmitry
(см. раскрытие макр)
Alexander
ой, не хочется
Dmitry
У
Dmitry
У тебя нет выбора )
Alexander
давай я пример приведу
Alexander
ну я может неверно объяснил
Kirill
а завернуть в 1 парсер не канает?
Alexander
начну с простого, у меня есть Token!foo, могу ли я человеческим и быстрым образом вернуть что-то другое если в теле токена у меня !
Alexander
вообще интерпретация Token может зависеть от того, что именно там в foo напарсилось, но на это наверное можно и забить
Dmitry
Ну мало данных - как ты парсишь, откуда вернуть
Alexander
есть строка текста, есть аттопарсер, мне нужно вернуть структуру типа [SP] где SP = S Text | P Token Foo
Alexander
желательно максимально эффективно
Alexander
а если это дело без backtracing-а можно сделать то совсем прекрасно
Dmitry
Ну. По опыту, как только у тебя от токенизации и близкого к тому перешло к парсингу - аттопарсек в сторону, и парсишь по настоящему
Alexander
по настоящему это как?
Dmitry
Аттопарсеком получаешь поток токенов, и дальше его уже парсишь. Или каким нибудь парсер генератором, или вручную
Dmitry
В твоём случае выглядит похоже на то, что можно обойтись аттопарсеком - но сходу не могу сообразить, как
Dmitry
Ну например - внутри парсера запустить парсинг токена
Dmitry
И вернуть что-то в зависимости от результатов
Dmitry
Те считать Token!foo
Dmitry
Распарить (внутри) его другим парсером
Alexander
это разумно
Dmitry
Вернуть результат в зависимости от того, что напарсилось
Alexander
да в общем-то верно
Alexander
т.е. вообще тупо сделать Tokenize который вернёт мне [(TokenType, Int, Int)] ?
Alexander
или вообще [(Int, Int)]
Dmitry
Ну это зависит от того, что ты делаешь, пока не совсем очевидно
Hermann
anyone know SePi language?
Alexander
@The_h3rmann I doubt, never heard about it on this channel
Alexander
так у меня есть data Funky a b = This a | That b | ThisOrThat (a,b) есть что-то готовое для такой странной вещи?
Зигохистоморфный
Зигохистоморфный
Alexander
да, нашел
Alexander
теперь надо решить хочу ли я тащить пакет
IC
Alexander
нет, or
IC
Тогда откуда там кортеж?
Alexander
в общем у меня есть штука, которую можно распарсить и так и так
Alexander
и я не знаю, что это, я конструирую все возможные элементы, и пусть там наверху решают
Alexander
т.е. "or" там по смыслу
Alexander
по структуре, конечно "and"
IC
с - семантика
Alexander
+
IC
Ambiguous a b
Alexander
+
Dmitry
Dmitry
Есть куча отрезков на прямой, они могут пересекаться. Надо найти суммарную покрытую длину.
Dmitry
Можете подсказать, есть готовые библиотеки для этого?
Cheese
я сначала хотел минимизировать пересечения, потом перестроил модель так, чтобы пересечений вообще не было
Dmitry
Да, так было бы хорошо. Ладно, пойду искать
Алексей ayaye :)
Cheese
можно строить индекс по началам и концам, можно как-нибудь R-деревья поиспользовать, наверно
Dmitry
Да уже нашёл: https://hackage.haskell.org/package/SegmentTree-0.3/docs/Data-SegmentTree.html
Dmitry
да вроде алгоритм несложный
Да я уже был готов перебором написать, просто зачем, если задача кажется достаточно типовой. В результате нашёл либу, кажется, подходит.
IC
там cabal-install случаем не научили ещё out of tree сборку?