Finalize draft of compilers part 0.
This commit is contained in:
		
							parent
							
								
									8466a5601e
								
							
						
					
					
						commit
						cd574b43fd
					
				@ -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`”. Заметьте, что вызов функций имеет приоритет выше приоритета арифметических операций.
 | 
					Позже, мы добавим к этому списку выражения 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`”.   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Вот и конец нашего обзора! В следующей статье, мы начнем с лексического анализа, что является первым шагом в процессе трансформации программного текста в исполняемые файлы.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Список Статей
 | 
				
			||||||
 | 
					* Ой! Тут как-то пусто.
 | 
				
			||||||
 | 
					* Вы, наверно, читаете черновик.
 | 
				
			||||||
 | 
					* Если нет, то пожалуйста напишите мне об этом!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user