Size: a a a

Compiler Development

2020 January 03

AK

Andrei Kurosh in Compiler Development
Alexander Tchitchigin
Так оно же во всех языках так работает - нет, что ли?
Кстати нет, в F# можно пометить константу специальным атрибутом Literal - тогда будет браться ее значение, а не создаваться новая одноименная переменная поверх:


https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/pattern-matching#constant-patterns
источник

YS

Yuriy Syrovetskiy in Compiler Development
Roman Elizarov
Ну вот в С# сделали для людей, однако. А там где фантазии не хватает, то тащат из Хаскеля. Вот не знаю, кстати, Хаскель сам изобрел смешать выражения и формальные ~выражения~ параметры в шаблонах в одну кучу или откуда утащил?
что именно смешали в кучу? можете пояснить примером?
источник

RE

Roman Elizarov in Compiler Development
Peter Sovietov
У меня в raddsl метапеременные еще и являются сущностями первого класса, но явно видно, где они создаются.
То есть можно написать так:

rule(BinOp("+", let(X=number), let(Y=number)), ...

а можно:

X = let(X=number)
Y = let(Y=number)
rule(BinOp("+", X, Y), ...
Ну или так. В C# 9 предлагают писать в шаблонах int x (или var x) чтобы завести новую переменную по результатам сопоставления с образцом и отличать её, тем самым, от шаблона x, который будет использовать знаечение x.
источник

VK

Val Krylov in Compiler Development
Peter Sovietov
Вот x в "x + 0" и является метапеременной, которая "захватывает" соответствующее конкретное сопоставляемое значение. Это основа, что в Haskell, что в Prolog, что Mathematica... Без этой возможности PM теряет, по большому счету, всю свою выразительность!
Вопрос в том, как отличить введение нового идентификатора от применения старого. Выше упомянули варианты с ключевыми словами из разных языков. У меня для новых идентификаторов, предусматривающих рантайм-значения, используется ?x (т.е. question mark перед идентификатором), тоже решает проблему, но более компактно.
источник

E

EgorBo in Compiler Development
Roman Elizarov
Ну или так. В C# 9 предлагают писать в шаблонах int x (или var x) чтобы завести новую переменную по результатам сопоставления с образцом и отличать её, тем самым, от шаблона x, который будет использовать знаечение x.
ты про if (obj is Foo foo) или конкретно в пм?
источник

PS

Peter Sovietov in Compiler Development
Roman Elizarov
Ну или так. В C# 9 предлагают писать в шаблонах int x (или var x) чтобы завести новую переменную по результатам сопоставления с образцом и отличать её, тем самым, от шаблона x, который будет использовать знаечение x.
А в Прологе программисты отличают переменную от атома по регистру букв или подчеркиванию.
источник

YS

Yuriy Syrovetskiy in Compiler Development
Roman Elizarov
Я имел в виду формальное параметры. Шаблон "x" и "x+0" имеют разный смысл — первый это формальный парметр, второй это выражение.
в Хаскеле нельзя использовать выражения в шаблонах. "x + 0" не пройдёт
источник

VY

Vasiliy Yorkin in Compiler Development
А что за шаблоны в Хаскеле? Чего-то я пропустил, почитаю сначала диалог
источник

PS

Peter Sovietov in Compiler Development
Yuriy Syrovetskiy
в Хаскеле нельзя использовать выражения в шаблонах. "x + 0" не пройдёт
Можно в rewriting rules! :)
источник

YS

Yuriy Syrovetskiy in Compiler Development
Val Krylov
Вопрос в том, как отличить введение нового идентификатора от применения старого. Выше упомянули варианты с ключевыми словами из разных языков. У меня для новых идентификаторов, предусматривающих рантайм-значения, используется ?x (т.е. question mark перед идентификатором), тоже решает проблему, но более компактно.
в Хаскеле эта проблема решена просто — запрещено использовать переменные, можно только вводить новые
источник

YS

Yuriy Syrovetskiy in Compiler Development
Vasiliy Yorkin
А что за шаблоны в Хаскеле? Чего-то я пропустил, почитаю сначала диалог
сопоставляемые образцы
источник

PS

Peter Sovietov in Compiler Development
Val Krylov
Вопрос в том, как отличить введение нового идентификатора от применения старого. Выше упомянули варианты с ключевыми словами из разных языков. У меня для новых идентификаторов, предусматривающих рантайм-значения, используется ?x (т.е. question mark перед идентификатором), тоже решает проблему, но более компактно.
А в Ometa более изящно, как мне кажется, сделано: через двоеточие. BinOp("+", number:x, number:y). Или же просто BinOp("+", :x, :y).

Спасибо за уточнение, я немного поторопился с начальным ответом Роману. Его критика вполне уместна.
источник

RE

Roman Elizarov in Compiler Development
Yuriy Syrovetskiy
что именно смешали в кучу? можете пояснить примером?
Ну в любом языка есть идентификаторы и выражения. И в "обычном" коде, где ожидается выражение, вы можете как написать идентификатор (имея в виду его значение), так и константу, так и более сложное выражение в котором от идентификатора будет браться его значение. Путаницы нет. А дальше у вас есть шаблоны типа Point(x, y). И что такое пишется в позиции x и y? Вот в C++ предлгают разрешать там писать как выражения так и идентификаторы, но смысл идентификаторов будет другой, не такой как вы выражении — они будут означать формальный параметр (а не значение). Это меня и шокировало до глубины души (но C++ здесь далеко не одинок). Ну они там еще предлагают специальный синтаксис чтобы указать что хочется именно выражение.
источник

MB

Mikail Bagishov in Compiler Development
Бтв, в Rust так же работает
источник

RE

Roman Elizarov in Compiler Development
Очень жаль (всё так)
источник

MB

Mikail Bagishov in Compiler Development
Зато поведение матча не зависит от внешено скоупа
источник

YS

Yuriy Syrovetskiy in Compiler Development
Roman Elizarov
Ну в любом языка есть идентификаторы и выражения. И в "обычном" коде, где ожидается выражение, вы можете как написать идентификатор (имея в виду его значение), так и константу, так и более сложное выражение в котором от идентификатора будет браться его значение. Путаницы нет. А дальше у вас есть шаблоны типа Point(x, y). И что такое пишется в позиции x и y? Вот в C++ предлгают разрешать там писать как выражения так и идентификаторы, но смысл идентификаторов будет другой, не такой как вы выражении — они будут означать формальный параметр (а не значение). Это меня и шокировало до глубины души (но C++ здесь далеко не одинок). Ну они там еще предлагают специальный синтаксис чтобы указать что хочется именно выражение.
мне показалось, что вы утверждали, что в Хаскеле и классическом ФП смешано в кучу что-то. про всё ФП не знаю, но в Хаскеле синтаксис выражений и образцов не пересекаются (хотя умышленно сделаны похожими в некоторых чертах), такой идентификатор означает всегда только введение новой переменной, использовать старые нельзя. в выражениях наоборот. как с семечками и кредитами
источник

G

Gymmasssorla in Compiler Development
Alexander Tchitchigin
Так оно же во всех языках так работает - нет, что ли?
В Rust - ошибка компиляции
источник

MB

Mikail Bagishov in Compiler Development
Gymmasssorla
В Rust - ошибка компиляции
источник

MB

Mikail Bagishov in Compiler Development
хотя кстати, с немаленькой вероятностью компилятор кинет варнинг, как в моем случае.
источник