Size: a a a

Compiler Development

2020 January 03

RE

Roman Elizarov in Compiler Development
Yuriy Syrovetskiy
мне показалось, что вы утверждали, что в Хаскеле и классическом ФП смешано в кучу что-то. про всё ФП не знаю, но в Хаскеле синтаксис выражений и образцов не пересекаются (хотя умышленно сделаны похожими в некоторых чертах), такой идентификатор означает всегда только введение новой переменной, использовать старые нельзя. в выражениях наоборот. как с семечками и кредитами
Да нет. В Хаскеле-то всё согласованно внутренне. Однако, очень больно смотреть когда люди в совсем не-Хаскель пытаются затащить Хаскель-пободный(ли?) синтаксис для компактного паттерн-матчинга.
источник

G

Gymmasssorla in Compiler Development
А почему так???
источник

VK

Val Krylov in Compiler Development
Yuriy Syrovetskiy
в Хаскеле эта проблема решена просто — запрещено использовать переменные, можно только вводить новые
Это не "решена", а "сметена под ковёр". Для сравнения с где-то ранее определённым значением придётся либо пихать в паттерн equality test через "==", либо заранее готовить pattern synonyms, что ещё хуже.
источник

MB

Mikail Bagishov in Compiler Development
Gymmasssorla
А почему так???
Можно на форуме спросить. Спросишь - закинь ссылку
источник

K

Kakadu in Compiler Development
А что не так с  pattern synonyms?
источник

YS

Yuriy Syrovetskiy in Compiler Development
Val Krylov
Это не "решена", а "сметена под ковёр". Для сравнения с где-то ранее определённым значением придётся либо пихать в паттерн equality test через "==", либо заранее готовить pattern synonyms, что ещё хуже.
с другой стороны, можно писать образцы прямо в аргументах функции. было бы больно писать

f ?x ?y = x + y
источник

YS

Yuriy Syrovetskiy in Compiler Development
сравнение с ранее определённым значением иногда нужно, но это случается так редко, что совсем несложно гварды дописать. тем более, гварды всё равно приходится добавлять
источник

RE

Roman Elizarov in Compiler Development
Val Krylov
Это не "решена", а "сметена под ковёр". Для сравнения с где-то ранее определённым значением придётся либо пихать в паттерн equality test через "==", либо заранее готовить pattern synonyms, что ещё хуже.
TIL, в Rust такое же решение. Нельзя сделать match против значения сложного выражения.
источник

RE

Roman Elizarov in Compiler Development
И вот это взрывает мозг абсолютно. Константу "1" можно исползовать, но нельзя написать "let c = 1" и делать match по "c" вместо "1". Идея "don't use magic constants in your code" полностью вылетает в трубу.
источник

А⚙

Антон ⚙️ in Compiler Development
Roman Elizarov
И вот это взрывает мозг абсолютно. Константу "1" можно исползовать, но нельзя написать "let c = 1" и делать match по "c" вместо "1". Идея "don't use magic constants in your code" полностью вылетает в трубу.
Потому что

const ONE: u32 = 1;
match value {
  ONE => {},
  anything_else => {},
}
источник

А⚙

Антон ⚙️ in Compiler Development
А то, что нельзя рантайм-значения использовать в PM — это как раз нормально, потому что иначе exhaustiveness check вылетает в трубу
источник

RE

Roman Elizarov in Compiler Development
Антон ⚙️
Потому что

const ONE: u32 = 1;
match value {
  ONE => {},
  anything_else => {},
}
О-о-о-о! Охренеть однако. Это взывает мозг еще больше. Спасибо
источник

RE

Roman Elizarov in Compiler Development
(для тех кто читает, upper case тут не важно — важно что это const и вот тогда это уже совсем не новый формальный параметр).
источник

YS

Yuriy Syrovetskiy in Compiler Development
Roman Elizarov
И вот это взрывает мозг абсолютно. Константу "1" можно исползовать, но нельзя написать "let c = 1" и делать match по "c" вместо "1". Идея "don't use magic constants in your code" полностью вылетает в трубу.
не вылетает в трубу, но покрывается синтаксическим перцем

f x
 | x == the_one =
     result
источник

YS

Yuriy Syrovetskiy in Compiler Development
Yuriy Syrovetskiy
не вылетает в трубу, но покрывается синтаксическим перцем

f x
 | x == the_one =
     result
или

pattern One = 1

f One = 2
источник

RE

Roman Elizarov in Compiler Development
То есть если у вас где-то есть код вида match expression { x => ... } чтобы связать значение выражение с x но кто-то выше написал const x: type = ..., то вы тут же проиграли. Даже с C macros не было такого веселья.
источник

RE

Roman Elizarov in Compiler Development
Yuriy Syrovetskiy
не вылетает в трубу, но покрывается синтаксическим перцем

f x
 | x == the_one =
     result
Да понятно. Guards спасают в любом случае. Ну вот pattern matching как раз и делают, чтобы для "частых случаев" не выписывать условия, и чтобы вмесето f x  | x == 1 = ...  писать просто f 1 = ....
источник

А⚙

Антон ⚙️ in Compiler Development
Roman Elizarov
То есть если у вас где-то есть код вида match expression { x => ... } чтобы связать значение выражение с x но кто-то выше написал const x: type = ..., то вы тут же проиграли. Даже с C macros не было такого веселья.
Необязательно, итоговое выражение может не покрывать все возможные случаи, и компилятор на это укажет
источник

VK

Val Krylov in Compiler Development
Yuriy Syrovetskiy
с другой стороны, можно писать образцы прямо в аргументах функции. было бы больно писать

f ?x ?y = x + y
def !f (?x int, ?y int) = x + y

Зато предсказуемо одинаково можно рассматривать в любых конструкциях языка, как существующих, так и добавляемых пользовательскими EDSL. В отличие от непредсказуемой синтаксической магии GHC extensions. В общем, кому что. :)
источник

YS

Yuriy Syrovetskiy in Compiler Development
мне бы хотелось посмотреть на компромисс с одновременным явным введением переменных в образцах и образцами в аргументах функций
источник