Size: a a a

Programming Offtop

2021 February 12

I

Ilmir in Programming Offtop
(
Нет, ты говоришь про юниверсы a : Type, Type : Type 1, Type 1 : Type 2 и т.д.
женерики/хкт ортогональны, это средства универсальной квантификации, с какой бы аксиоматикой их не рассматривать
Ты это серьёзно про любую аксиоматику? Даже после того, как я указал на аксиоматику без квантификации, которая не покрывается теорией типов?
источник

(

( in Programming Offtop
Ilmir
Ты это серьёзно про любую аксиоматику? Даже после того, как я указал на аксиоматику без квантификации, которая не покрывается теорией типов?
> аксиоматика без квантификации, которая не покрывается теорией типов
Это ты про эти лисповые грамматики?
Если не покрывается, значит, и универсальной квантификации женериками/хкт там нет 🤷‍♀️
источник

КР

Кирилл Романенко... in Programming Offtop
Igor
Спасибо за предложение, но действительно нету планов менять один андроид на другой
Окей.))
источник

I

Ilmir in Programming Offtop
(
> аксиоматика без квантификации, которая не покрывается теорией типов
Это ты про эти лисповые грамматики?
Если не покрывается, значит, и универсальной квантификации женериками/хкт там нет 🤷‍♀️
Бинго! В зависимости от аксиоматики у тебя будут разные теоремы, а следовательно, применительно к языкам программирования, разные валидные с точки зрения языка программы, а следовательно, разные идиомы (ну, последний шаг зависит от определения идиомы, разумеется). Об этом я тебе всё это время талдычу.
источник

(

( in Programming Offtop
Ilmir
Бинго! В зависимости от аксиоматики у тебя будут разные теоремы, а следовательно, применительно к языкам программирования, разные валидные с точки зрения языка программы, а следовательно, разные идиомы (ну, последний шаг зависит от определения идиомы, разумеется). Об этом я тебе всё это время талдычу.
Это конечно здорово, но во-первых, вернемся к вопросу https://t.me/pofftop/300418
источник

I

Ilmir in Programming Offtop
У тебя тайпчекер уйдёт в рекурсию, если выводить типы. Надо будет костылями править в зависимости от того, что в правилах написано.
источник

(

( in Programming Offtop
Ilmir
У тебя тайпчекер уйдёт в рекурсию, если выводить типы. Надо будет костылями править в зависимости от того, что в правилах написано.
Но ты же интерпретируешь строки
источник

I

Ilmir in Programming Offtop
(
Но ты же интерпретируешь строки
Возвращаемый тип будет разный в зависимости от входной строки. Возможно, завтипами можно покрыть, но мои попытки на коке это сделать ни к чему не привели.
источник

(

( in Programming Offtop
Ilmir
Возвращаемый тип будет разный в зависимости от входной строки. Возможно, завтипами можно покрыть, но мои попытки на коке это сделать ни к чему не привели.
Ты же тип все равно не узнаешь, пока не запустишь. Это уже совсем какие-то основы компиляторо-/интерпретаторо- писания, что ты в языке-хосте делаешь структуру, которая выражает множество значений/вычислений целевого языка
Если тебе придет на вход грамматика, которую ты обрабатывать не умеешь, ты упадешь что на лиспе, что на любом другом языке
источник

(

( in Programming Offtop
Разница в том, что на лиспе тебе нужно описать только грамматику, а на каком-нибудь хаскеле ещё и аст, но это всегда так, когда сравниваются динтипизированные и статтипизированные языки
источник

I

Ilmir in Programming Offtop
(
Ты же тип все равно не узнаешь, пока не запустишь. Это уже совсем какие-то основы компиляторо-/интерпретаторо- писания, что ты в языке-хосте делаешь структуру, которая выражает множество значений/вычислений целевого языка
Если тебе придет на вход грамматика, которую ты обрабатывать не умеешь, ты упадешь что на лиспе, что на любом другом языке
Не, там сложность в другом. У тебя, грубо говоря, должна быть функция grammar(string), которая вызывает у себя внутри себя функции из массива rules[<rule-name>](results_of_subrules_application). Проблема в том, что когда ты компилируешь grammar, тебе не известны типы, которые возвращают rules.
источник

I

Ilmir in Programming Offtop
Решается только перекомпиляцией grammar для каждого нового rules.
источник

I

Ilmir in Programming Offtop
Мой пруф оф концепт на котлине не разрешает объявлять грамматики без правил как раз по этой причине.
источник

I

Ilmir in Programming Offtop
Собственно, вот так выглядит арифметика на нём
class Arithmetics : Grammar<Int>() {
   override val TOP = ::additive

   fun additive(): R<Int> =
       on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
           if (op == '+') a + b else a - b
       })

   fun multiplicative(): R<Int> =
       on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
           when (op) {
               '*' -> a * b
               '/' -> a / b
               '%' -> a % b
               else -> error("unreachable")
           }
       })

   fun grouping(): R<Int> =
       on('(')(::additive)(')')({ _, a, _ -> a }) I
       on(::literal)({ a -> a })

   fun literal(): R<Int> =
       on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}
Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
источник

I

Igor in Programming Offtop
Ilmir
Собственно, вот так выглядит арифметика на нём
class Arithmetics : Grammar<Int>() {
   override val TOP = ::additive

   fun additive(): R<Int> =
       on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
           if (op == '+') a + b else a - b
       })

   fun multiplicative(): R<Int> =
       on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
           when (op) {
               '*' -> a * b
               '/' -> a / b
               '%' -> a % b
               else -> error("unreachable")
           }
       })

   fun grouping(): R<Int> =
       on('(')(::additive)(')')({ _, a, _ -> a }) I
       on(::literal)({ a -> a })

   fun literal(): R<Int> =
       on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}
Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
А шо это такое?
источник

I

Ilmir in Programming Offtop
Igor
А шо это такое?
источник

I

Igor in Programming Offtop
👌
источник

I

Ilmir in Programming Offtop
Ну я восхитился тому, как там сделаны PEG-парсеры и захотел сделать также. Быстро понял, что на котлине такое можно покрыть только в ограниченном случае.
источник

I

Igor in Programming Offtop
Бля почему по peg-парсерам гуглятся статья Гвидо 😒
источник

(

( in Programming Offtop
Ilmir
Собственно, вот так выглядит арифметика на нём
class Arithmetics : Grammar<Int>() {
   override val TOP = ::additive

   fun additive(): R<Int> =
       on(::multiplicative)('+' I '-')(::multiplicative)({ a, op, b ->
           if (op == '+') a + b else a - b
       })

   fun multiplicative(): R<Int> =
       on(::grouping)('*' I '/' I '%')(::grouping)({ a, op, b ->
           when (op) {
               '*' -> a * b
               '/' -> a / b
               '%' -> a % b
               else -> error("unreachable")
           }
       })

   fun grouping(): R<Int> =
       on('(')(::additive)(')')({ _, a, _ -> a }) I
       on(::literal)({ a -> a })

   fun literal(): R<Int> =
       on(('0'..'9').oneOrMore())({ a -> a.toInt() })
}
Скобки вокруг лямбд можно будет скоро убрать. И вынести их в отдельные переменные, главное, чтобы типы сошлись. А вот если я захочу, ну я не знаю, дерево выражений строить - баста, копипаст.
Так, и почему у тебя здесь будет копипаст?
источник