From cd574b43fdddf8b6777610f94897d70697533af9 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Wed, 2 Sep 2020 16:56:37 -0700 Subject: [PATCH] Finalize draft of compilers part 0. --- content/blog/00_compiler_intro.ru.md | 33 +++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/content/blog/00_compiler_intro.ru.md b/content/blog/00_compiler_intro.ru.md index f7e779b..411baa5 100644 --- a/content/blog/00_compiler_intro.ru.md +++ b/content/blog/00_compiler_intro.ru.md @@ -51,7 +51,7 @@ description: "todo" * С++. Я стараюсь писать код правильно и по последним стандартам, но я не эксперт. Я не буду объяснять синтаксис или правила С++, но разумеется буду описывать что именно делает мой код с точки зрения компиляторов. #### Синтаксис Нашего Языка -Саймон Пейтон Джоунс, в одном из своих [~~двух~~ многочисленных](https://www.reddit.com/r/ProgrammingLanguages/comments/dsu115/compiling_a_functional_language_using_c/f6t52mh?utm_source=share&utm_medium=web2x&context=3) трудов на тему функциональных языков, отметил что большинство из этих языков по сути очень похожи друг на друга; часто, главная разница состоит именно в их синтаксисе. На данный момент, выбор синтаксиса - наша главная степень свободы. Нам точно нужно предоставить доступ к следующим ???: +Саймон Пейтон Джоунс, в одном из своих [~~двух~~ многочисленных](https://www.reddit.com/r/ProgrammingLanguages/comments/dsu115/compiling_a_functional_language_using_c/f6t52mh?utm_source=share&utm_medium=web2x&context=3) трудов на тему функциональных языков, отметил что большинство из этих языков по сути очень похожи друг на друга; часто, главная разница состоит именно в их синтаксисе. На данный момент, выбор синтаксиса - наша главная степень свободы. Нам точно нужно предоставить доступ к следующим вещам: * Декларациям функций * Вызову функций @@ -62,3 +62,34 @@ description: "todo" Позже, мы добавим к этому списку выражения let/in и лямбда-функции. С арифметикой разобраться не сложно - числа будут писаться просто как `3`, значения выражений как `1+2*3` будут высчитываться по обычным математическим правилам. Вызов функций ненамного сложнее. Выражение `f x` будет значить “вызов функции `f` с параметром `x`”, а `f x + g y` - “сумма значений `f x` и `g y`”. Заметьте, что вызов функций имеет приоритет выше приоритета арифметических операций. Теперь давайте придумаем синтаксис для деклараций функций. Я предлогаю следующий вариант: + +``` +defn f x = { x + x } +``` + +А для типов данных: + +``` +data List = { Nil, Cons Int List } +``` + +Заметьте, что мы пока пользуемся мономорфными декларациями типов данных. Позже, в одиннадцатой части, мы добавим синтаксис для полиморфных деклараций. + +В последнюю очередь, давайте определимся с синтаксисом сопоставления с образцом: + +``` +case l of { + Nil -> { 0 } + Cons x xs -> { x } +} +``` + +Представленная выше распечатка читается как: “если лист `l` сопоставим с `Nil`, то все выражение возвращает значение `0`; иначе, если лист сопоставим с `Cons x xs` (что, опираясь на декларацию `List`, означает, что лист состоит из значений `x`, с типом `Int`, и `xs`, с типом `List`), то выражение возвращает `x`”. + +Вот и конец нашего обзора! В следующей статье, мы начнем с лексического анализа, что является первым шагом в процессе трансформации программного текста в исполняемые файлы. + +### Список Статей +* Ой! Тут как-то пусто. +* Вы, наверно, читаете черновик. +* Если нет, то пожалуйста напишите мне об этом! +