From f7f0ee1b1cb45f20ca53132edb58fb82a8b94958 Mon Sep 17 00:00:00 2001 From: rexim Date: Wed, 27 Mar 2024 08:16:40 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=8B=20=D1=81=D1=80=D0=B0=D0=B2=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ПЛАН.txt | 14 +++++++------- исходники/компилятор.rs | 24 ++++++++++++++++++++++++ исходники/лексика.rs | 37 +++++++++++++++++++++++++------------ исходники/синтаксис.rs | 34 ++++++++++++++++++++-------------- модули/прелюдия.хуя | 6 +++--- примеры/03-имя.хуя | 3 ++- примеры/04-физз-базз.хуя | 6 +++--- примеры/05-фибоначчи.хуя | 2 +- примеры/06-рейлиб.хуя | 13 +++++++------ примеры/07-рекурсия.хуя | 2 +- примеры/09-правило110.хуя | 4 ++-- примеры/10-игра-жизнь.хуя | 10 +++++----- редакторы/режим-хуя.el | 4 ++-- тесты/тест.хуя | 6 +++--- 14 files changed, 105 insertions(+), 60 deletions(-) diff --git a/ПЛАН.txt b/ПЛАН.txt index 9511be1..19ae42b 100644 --- a/ПЛАН.txt +++ b/ПЛАН.txt @@ -40,24 +40,24 @@ - [x] Многострочные комментарии - [x] Не забудь избавить от прямого доступа к символам, чтобы случайно не крашнуться. - [x] «для» должен неявно объявлять переменную -- [ ] Операторы сравнения -\ /- =\ /= +- [x] Операторы сравнения - [ ] Экранирование «ёлочек» - [ ] Switch-case-ы в каком-то виде («вилка») +- [ ] Аналоги операций выхода из циклов (continue, break) +- [ ] Шестнадцатеричные литералы - [ ] Что дальше? -- То, что не успели в предыдущем месяце - - [ ] Перечисления в каком-нибудь виде - - [ ] Динамическая память в каком-нибудь виде - - [ ] Передача переменных по ссылке - - Примеры - [x] Rule110 - [ ] Mandelbrot - Низкий приоритет - [ ] Переменная «результат» как в Паскале. + - Если есть передача аргументов по-ссылке, то оно особо и не нужно. - [ ] Провека, что все потоки исполнения возвращают значение. - [ ] Выравнивание структур как в Си - [ ] WebAssembly - [ ] Не прерывай компиляцию из-за одной лишь ошибки. - + - [ ] Перечисления в каком-нибудь виде + - [ ] Динамическая память в каком-нибудь виде + - [ ] Передача переменных по ссылке diff --git a/исходники/компилятор.rs b/исходники/компилятор.rs index 7f90603..0e1ae84 100644 --- a/исходники/компилятор.rs +++ b/исходники/компилятор.rs @@ -381,6 +381,30 @@ fn скомпилировать_выражение(пп: &mut ПП, имена: } } } + ВидБинопа::НеРавно => { + let левый_тип = скомпилировать_выражение(пп, имена, текущая_процедура, локальные_имена, &левое, временный_размер)?; + let правый_тип = скомпилировать_выражение(пп, имена, текущая_процедура, локальные_имена, &правое, временный_размер)?; + проверить_типы(правое.лок(), &левый_тип, &правый_тип)?; + match левый_тип { + Тип::Нат64 | Тип::Цел64 | Тип::Нат8 => { + пп.код.push(Инструкция{ вид: ВидИнструкции::НатРавно, лок: ключ.лок.clone() }); + пп.код.push(Инструкция{ вид: ВидИнструкции::ЛогОтрицание, лок: ключ.лок.clone() }); + Ok(Тип::Лог) + } + _ => { + сделать!(левое.лок(), "Сравнение типа «{тип}»", тип = левый_тип.текст()); + Err(()) + } + } + } + ВидБинопа::МеньшеРавно => { + сделать!(&ключ.лок, "Реализовать биноп МеньшеРавно"); + return Err(()); + } + ВидБинопа::БольшеРавно => { + сделать!(&ключ.лок, "Реализовать биноп БольшеРавно"); + return Err(()); + } ВидБинопа::Меньше => { let левый_тип = скомпилировать_выражение(пп, имена, текущая_процедура, локальные_имена, &левое, временный_размер)?; let правый_тип = скомпилировать_выражение(пп, имена, текущая_процедура, локальные_имена, &правое, временный_размер)?; diff --git a/исходники/лексика.rs b/исходники/лексика.rs index 018d498..9f09a77 100644 --- a/исходники/лексика.rs +++ b/исходники/лексика.rs @@ -12,11 +12,21 @@ pub const ПРИСТАВКИ_ПРЕПИНАНИЙ: &[(&[char], ВидЛексе (&[':', '='], ВидЛексемы::Присваивание), (&[':'], ВидЛексемы::Двоеточие), (&[','], ВидЛексемы::Запятая), + (&['+', '!', '='], ВидЛексемы::МеньшеЛи), + (&['+', '!'], ВидЛексемы::МеньшеРавноЛи), + (&['+', '?', '='], ВидЛексемы::БольшеРавноЛи), + (&['+', '?'], ВидЛексемы::БольшеЛи), (&['+'], ВидЛексемы::Плюс), + (&['-', '!', '='], ВидЛексемы::БольшеЛи), + (&['-', '!'], ВидЛексемы::БольшеРавноЛи), + (&['-', '?', '='], ВидЛексемы::МеньшеРавноЛи), + (&['-', '?'], ВидЛексемы::МеньшеЛи), (&['-'], ВидЛексемы::Минус), (&['*'], ВидЛексемы::Звёздочка), (&['/'], ВидЛексемы::ПрямаяНаклонная), - (&['=', '='], ВидЛексемы::РавноРавно), + (&['?', '='], ВидЛексемы::РавноЛи), + (&['!', '='], ВидЛексемы::НеРавноЛи), + (&['!'], ВидЛексемы::Не), (&['='], ВидЛексемы::Равно), ]; @@ -30,9 +40,6 @@ pub const КЛЮЧЕВЫЕ_СЛОВА: &[(&str, ВидЛексемы)] = &[ ("пока", ВидЛексемы::КлючПока), ("для", ВидЛексемы::КлючДля), ("вернуть", ВидЛексемы::КлючВернуть), - ("не", ВидЛексемы::КлючНе), - ("мн", ВидЛексемы::КлючМн), - ("бл", ВидЛексемы::КлючБл), ("или", ВидЛексемы::КлючИли), ("и", ВидЛексемы::КлючИ), ("нч", ВидЛексемы::КлючНч), @@ -64,9 +71,6 @@ pub enum ВидЛексемы { КлючПока, КлючДля, КлючВернуть, - КлючНе, - КлючМн, - КлючБл, КлючНч, КлючИли, КлючИ, @@ -95,7 +99,13 @@ pub enum ВидЛексемы { ПрямаяНаклонная, Присваивание, Равно, - РавноРавно, + РавноЛи, + МеньшеЛи, + МеньшеРавноЛи, + БольшеЛи, + БольшеРавноЛи, + Не, + НеРавноЛи, ЦелЧисло, ВещЧисло, @@ -118,9 +128,6 @@ impl ВидЛексемы { ВидЛексемы::КлючПока => Сущ{текст: "«пока»", род: Род::Сред}, ВидЛексемы::КлючДля => Сущ{текст: "«для»", род: Род::Сред}, ВидЛексемы::КлючВернуть => Сущ{текст: "«вернуть»", род: Род::Сред}, - ВидЛексемы::КлючНе => Сущ{текст: "«не»", род: Род::Сред}, - ВидЛексемы::КлючМн => Сущ{текст: "«мн»", род: Род::Сред}, - ВидЛексемы::КлючБл => Сущ{текст: "«бл»", род: Род::Сред}, ВидЛексемы::КлючИли => Сущ{текст: "«или»", род: Род::Муж}, ВидЛексемы::КлючИ => Сущ{текст: "«и»", род: Род::Муж}, ВидЛексемы::КлючНч => Сущ{текст: "«нч»", род: Род::Сред}, @@ -149,8 +156,14 @@ impl ВидЛексемы { ВидЛексемы::Звёздочка => Сущ{текст: "звёздочка", род: Род::Жен}, ВидЛексемы::ПрямаяНаклонная => Сущ{текст: "прямая наклонная черта", род: Род::Жен}, ВидЛексемы::Равно => Сущ{текст: "равно", род: Род::Сред}, - ВидЛексемы::РавноРавно => Сущ{текст: "двойное равно", род: Род::Сред}, ВидЛексемы::Присваивание => Сущ{текст: "присваивание", род: Род::Сред}, + ВидЛексемы::РавноЛи => Сущ{текст: "«равно ли»", род: Род::Сред}, + ВидЛексемы::МеньшеЛи => Сущ{текст: "«меньше ли»", род: Род::Сред}, + ВидЛексемы::БольшеЛи => Сущ{текст: "«больше ли»", род: Род::Сред}, + ВидЛексемы::МеньшеРавноЛи => Сущ{текст: "«меньше либо равно ли»", род: Род::Сред}, + ВидЛексемы::БольшеРавноЛи => Сущ{текст: "«больше либо равно ли»", род: Род::Сред}, + ВидЛексемы::Не => Сущ{текст: "«не»", род: Род::Сред}, + ВидЛексемы::НеРавноЛи => Сущ{текст: "«не равно ли»", род: Род::Сред}, ВидЛексемы::ЦелЧисло => Сущ{текст: "целое число", род: Род::Сред}, ВидЛексемы::ВещЧисло => Сущ{текст: "вещественное число", род: Род::Сред}, diff --git a/исходники/синтаксис.rs b/исходники/синтаксис.rs index 896a7ae..9a8ab30 100644 --- a/исходники/синтаксис.rs +++ b/исходники/синтаксис.rs @@ -23,6 +23,8 @@ impl Переменная { pub enum ВидБинопа { Меньше, Больше, + МеньшеРавно, + БольшеРавно, Сложение, Вычитание, Умножение, @@ -31,6 +33,7 @@ pub enum ВидБинопа { Или, И, Равно, + НеРавно, Как, Поле, ЛевоеБитовоеСмещение, @@ -43,35 +46,38 @@ impl ВидБинопа { fn приоритет(&self) -> usize { use self::ВидБинопа::*; match self { - Или => Self::МАКС_ПРИОРИТЕТ - 7, - И => Self::МАКС_ПРИОРИТЕТ - 6, - Меньше | Больше | Равно => Self::МАКС_ПРИОРИТЕТ - 5, - Сложение | Вычитание => Self::МАКС_ПРИОРИТЕТ - 4, - Умножение | Деление | Остаток => Self::МАКС_ПРИОРИТЕТ - 3, + Или => Self::МАКС_ПРИОРИТЕТ - 7, + И => Self::МАКС_ПРИОРИТЕТ - 6, + Меньше | Больше | МеньшеРавно | БольшеРавно | Равно | НеРавно => Self::МАКС_ПРИОРИТЕТ - 5, + Сложение | Вычитание => Self::МАКС_ПРИОРИТЕТ - 4, + Умножение | Деление | Остаток => Self::МАКС_ПРИОРИТЕТ - 3, // СДЕЛАТЬ: какой приоритет лучше всего для битовых смещений? - ЛевоеБитовоеСмещение | ПравоеБитовоеСмещение => Self::МАКС_ПРИОРИТЕТ - 2, - Как => Self::МАКС_ПРИОРИТЕТ - 1, - Поле => Self::МАКС_ПРИОРИТЕТ, + ЛевоеБитовоеСмещение | ПравоеБитовоеСмещение => Self::МАКС_ПРИОРИТЕТ - 2, + Как => Self::МАКС_ПРИОРИТЕТ - 1, + Поле => Self::МАКС_ПРИОРИТЕТ, } } fn по_виду_лексемы(вид: &ВидЛексемы) -> Option<ВидБинопа> { match вид { - ВидЛексемы::КлючМн => Some(ВидБинопа::Меньше), - ВидЛексемы::КлючБл => Some(ВидБинопа::Больше), + ВидЛексемы::РавноЛи => Some(ВидБинопа::Равно), + ВидЛексемы::МеньшеЛи => Some(ВидБинопа::Меньше), + ВидЛексемы::БольшеЛи => Some(ВидБинопа::Больше), + ВидЛексемы::МеньшеРавноЛи => Some(ВидБинопа::МеньшеРавно), + ВидЛексемы::БольшеРавноЛи => Some(ВидБинопа::БольшеРавно), + ВидЛексемы::НеРавноЛи => Some(ВидБинопа::НеРавно), ВидЛексемы::Плюс => Some(ВидБинопа::Сложение), ВидЛексемы::Минус => Some(ВидБинопа::Вычитание), ВидЛексемы::Звёздочка => Some(ВидБинопа::Умножение), ВидЛексемы::ПрямаяНаклонная => Some(ВидБинопа::Деление), ВидЛексемы::КлючОст => Some(ВидБинопа::Остаток), - ВидЛексемы::РавноРавно => Some(ВидБинопа::Равно), ВидЛексемы::КлючКак => Some(ВидБинопа::Как), ВидЛексемы::КлючИли => Some(ВидБинопа::Или), ВидЛексемы::КлючИ => Some(ВидБинопа::И), ВидЛексемы::Точка => Some(ВидБинопа::Поле), ВидЛексемы::КлючЛбс => Some(ВидБинопа::ЛевоеБитовоеСмещение), ВидЛексемы::КлючПбс => Some(ВидБинопа::ПравоеБитовоеСмещение), - _ => None + _ => None } } } @@ -124,7 +130,7 @@ impl Выражение { ВидЛексемы::Идент, ВидЛексемы::Строка, ВидЛексемы::ОткрытаяСкобка, - ВидЛексемы::КлючНе, + ВидЛексемы::Не, ВидЛексемы::КлючИстина, ВидЛексемы::КлючЛожь, ВидЛексемы::Минус, @@ -183,7 +189,7 @@ impl Выражение { let _ = лекс.вытащить_лексему_вида(&[ВидЛексемы::ЗакрытаяСкобка])?; Ok(выражение) } - ВидЛексемы::КлючНе => { + ВидЛексемы::Не => { let ключ = лексема; let выражение = Box::new(Выражение::разобрать(лекс)?); Ok(Выражение::Отрицание{ключ, выражение}) diff --git a/модули/прелюдия.хуя b/модули/прелюдия.хуя index 097419a..1a8485c 100644 --- a/модули/прелюдия.хуя +++ b/модули/прелюдия.хуя @@ -4,7 +4,7 @@ // Хотя, мы тогда теряем возможность печатать строки в режиме интерпретации. про печать_нат(число: нат) нч - если число == 0нат нч + если число ?= 0нат нч печать(«0»); вернуть; кц @@ -13,7 +13,7 @@ пер буфер: массив(ОБЪЁМ, нат8); пер размер: нат = 0нат; - пока число бл 0нат нч + пока число +? 0нат нч // СДЕЛАТЬ: размер += 1; размер := размер + 1нат; буфер(ОБЪЁМ как нат - размер) := (число ост 10нат + 48нат) как нат8; // СДЕЛАТЬ: буквенные литералы @@ -25,7 +25,7 @@ кц про печать_цел(число: цел) нч - если число мн 0 как цел нч + если число -? 0 как цел нч печать(«-»); число := -число; кц diff --git a/примеры/03-имя.хуя b/примеры/03-имя.хуя index 9303c5b..01b4419 100644 --- a/примеры/03-имя.хуя +++ b/примеры/03-имя.хуя @@ -11,6 +11,7 @@ пер длинна: нат = ввод(имя); // СДЕЛАТЬ: Логические операции с коротким замыканиям // Нужны ли они вообще? - если длинна бл 0нат то если имя(длинна-1нат) == 10нат как нат8 то длинна := длинна - 1нат; + если длинна +? 0нат то если имя(длинна-1нат) ?= 10нат как нат8 то длинна := длинна - 1нат; + // СДЕЛАТЬ: Однобайтовые литералы 10нат8 печать(«Привет, », срез(имя, 0нат, длинна), «!\н»); кц diff --git a/примеры/04-физз-базз.хуя b/примеры/04-физз-базз.хуя index cb00b94..0ae2e0c 100644 --- a/примеры/04-физз-базз.хуя +++ b/примеры/04-физз-базз.хуя @@ -4,10 +4,10 @@ // СДЕЛАТЬ: объявление индексной переменной прямо в цикле // для пер счет := 1..100 нч для счет := 1..100 нч - если счет ост 15 == 0 то печать(«ФиззБазз\н»); + если счет ост 15 ?= 0 то печать(«ФиззБазз\н»); // СДЕЛАТЬ: подумать как сократить конструкцию «иначе то если» - иначе то если счет ост 3 == 0 то печать(«Физз\н»); - иначе то если счет ост 5 == 0 то печать(«Базз\н»); + иначе то если счет ост 3 ?= 0 то печать(«Физз\н»); + иначе то если счет ост 5 ?= 0 то печать(«Базз\н»); иначе то печать(счет, «\н»); кц кц diff --git a/примеры/05-фибоначчи.хуя b/примеры/05-фибоначчи.хуя index 520c199..4589f31 100644 --- a/примеры/05-фибоначчи.хуя +++ b/примеры/05-фибоначчи.хуя @@ -8,7 +8,7 @@ // пер а, б, в: нат; пер а: цел = 0; пер б: цел = 1; - пока а мн ЛИМИТ нч + пока а -? ЛИМИТ нч печать(а, «\н»); пер в: цел = а + б; а := б; diff --git a/примеры/06-рейлиб.хуя b/примеры/06-рейлиб.хуя index 7f9d484..5f94f2f 100644 --- a/примеры/06-рейлиб.хуя +++ b/примеры/06-рейлиб.хуя @@ -2,7 +2,8 @@ // СДЕЛАТЬ: шестнадцатеричные литералы // ABCDEF -// АБСДЕФ +// АБЦДЕФ +// Походу не первый, кто до этого додумался: http://compiler.su/shestnadtsatirichnye-i-dvoichnye-konstanty.php конст ЦВЕТ_ФОНА = 4279769112нат; // 16%ФФ181818нат конст ЦВЕТ_КРАСНЫЙ = 4278190335нат; // 16%ФФ0000ФФнат @@ -36,25 +37,25 @@ открыть_окно(800, 600, адрес(«Привет, Raylib!»)); установить_целевую_частоту_кадров(60); пер пауза: лог = ложь; - пока не пора_закрыть_окно() нч + пока !пора_закрыть_окно() нч пер дельта_времени : вещ = получить_время_кадра(); пер ширина_экрана : вещ = получить_ширину_экрана() как вещ; пер высота_экрана : вещ = получить_высоту_экрана() как вещ; - если нажата_клавиша(КЛАВИША_ПРОБЕЛ) то пауза := не пауза; + если нажата_клавиша(КЛАВИША_ПРОБЕЛ) то пауза := !пауза; начать_рисовать(); очистить_фон(ЦВЕТ_ФОНА); для индекс := 0..ОБЪЁМ-1 нч - если не пауза нч + если !пауза нч пер новая_позиция: Вектор2; новая_позиция.икс := позиции(индекс).икс + дельты(индекс).икс*дельта_времени; - если новая_позиция.икс мн 0.0 или новая_позиция.икс + ШИРИНА как вещ бл ширина_экрана + если новая_позиция.икс -? 0.0 или новая_позиция.икс + ШИРИНА как вещ +? ширина_экрана то дельты(индекс).икс := -(дельты(индекс).икс); // СДЕЛАТЬ: можно ли как-то распарсить чтобы не нужны были скобки? иначе то позиции(индекс).икс := новая_позиция.икс; новая_позиция.игрек := позиции(индекс).игрек + дельты(индекс).игрек*дельта_времени; - если новая_позиция.игрек мн 0.0 или новая_позиция.игрек + ВЫСОТА как вещ бл высота_экрана + если новая_позиция.игрек -? 0.0 или новая_позиция.игрек + ВЫСОТА как вещ +? высота_экрана то дельты(индекс).игрек := -(дельты(индекс).игрек); иначе то позиции(индекс).игрек := новая_позиция.игрек; кц diff --git a/примеры/07-рекурсия.хуя b/примеры/07-рекурсия.хуя index c9a6f0d..7ee8e94 100644 --- a/примеры/07-рекурсия.хуя +++ b/примеры/07-рекурсия.хуя @@ -6,7 +6,7 @@ про отступ(ширина: цел) то для индекс := 1..ширина то печать(« »); про дерево(глубина: цел) нч - если глубина бл МАКС_ГЛУБИНА то вернуть; + если глубина +? МАКС_ГЛУБИНА то вернуть; дерево(глубина + 1); отступ(глубина*2); счетчик := счетчик + 1; diff --git a/примеры/09-правило110.хуя b/примеры/09-правило110.хуя index 0ad13d9..f148023 100644 --- a/примеры/09-правило110.хуя +++ b/примеры/09-правило110.хуя @@ -7,14 +7,14 @@ // СДЕЛАТЬ: передача массива по ссылке про печать_мира(мир: массив(РАЗМЕР, нат)) нч для индекс := 1..РАЗМЕР то - если мир(индекс - 1) == 0нат + если мир(индекс - 1) ?= 0нат то печать(«_»); иначе то печать(«%»); печать(«\н»); кц про главная() нч - если РАЗМЕР мн 3 то вернуть; + если РАЗМЕР -? 3 то вернуть; мир0(РАЗМЕР - 2) := 1нат; печать_мира(мир0); diff --git a/примеры/10-игра-жизнь.хуя b/примеры/10-игра-жизнь.хуя index 6fd98d2..2dcc917 100644 --- a/примеры/10-игра-жизнь.хуя +++ b/примеры/10-игра-жизнь.хуя @@ -32,12 +32,12 @@ пер соседи : цел = 0; для дстр := -1..1 то для дстл := -1..1 то - если не (дстр == 0 и дстл == 0) нч + если дстр != 0 или дстл != 0 нч пер строка: цел = строка0 + дстр; пер столбец: цел = столбец0 + дстл; // СДЕЛАТЬ: Биноп для «меньше либо равно». - если (0 мн строка или строка == 0) и строка мн ВЫСОТА то - если (0 мн столбец или столбец == 0) и столбец мн ШИРИНА то + если (0 -? строка или строка ?= 0) и строка -? ВЫСОТА то + если (0 -? столбец или столбец ?= 0) и столбец -? ШИРИНА то если поле(строка)(столбец) то соседи := соседи + 1; кц вернуть соседи; @@ -48,8 +48,8 @@ для столбец := 1..ШИРИНА нч пер соседи: цел = подсчитать_соседей(строка - 1, столбец - 1); если поле(строка - 1)(столбец - 1) - то скрытое_поле(строка - 1)(столбец - 1) := соседи == 2 или соседи == 3; - иначе то скрытое_поле(строка - 1)(столбец - 1) := соседи == 3; + то скрытое_поле(строка - 1)(столбец - 1) := соседи ?= 2 или соседи ?= 3; + иначе то скрытое_поле(строка - 1)(столбец - 1) := соседи ?= 3; кц кц diff --git a/редакторы/режим-хуя.el b/редакторы/режим-хуя.el index 18b0dfd..a9540f5 100644 --- a/редакторы/режим-хуя.el +++ b/редакторы/режим-хуя.el @@ -16,9 +16,9 @@ (eval-and-compile (defconst ключевые-слова-хуя - '("пер" "про" "конст" "пока" "мн" "бл" "нч" "кц" "для" + '("пер" "про" "конст" "пока" "нч" "кц" "для" "если" "то" "иначе" "вернуть" "замкнуть" "пропустить" - "структ" "союз" "как" "вкл" "внешняя" "не" "библ" "или" + "структ" "союз" "как" "вкл" "внешняя" "библ" "или" "и" "истина" "ложь" "лбс" "пбс" "ост"))) (defconst подсветка-хуя diff --git a/тесты/тест.хуя b/тесты/тест.хуя index 76e967d..2b27739 100644 --- a/тесты/тест.хуя +++ b/тесты/тест.хуя @@ -11,8 +11,8 @@ про тест_вещественных_чисел() нч печать(«Вещественная арифметика: », (17.0*2.0 + 35.0) как нат, «\н»); - печать(«Вещественное отрицание: », -69.0 мн 0.0, «\н»); - печать(«Вещественная логика: », 69.0 мн 420.0, « », 69.0 бл 420.0, «\н»); + печать(«Вещественное отрицание: », -69.0 -? 0.0, «\н»); + печать(«Вещественная сравнение: », 69.0 -? 420.0, « », 69.0 +? 420.0, «\н»); кц про баг_при_выделении_локальной_переменной_в_цикле_для() то // некорректно обозначались области видимости @@ -38,7 +38,7 @@ про главная() нч печать(«Печать чисел: », 0, «, », 69, «, », 1234567890, «\н»); - печать(«Печать логических: », 69 == 69, «, », 69 == 420, «\н»); + печать(«Печать логических: », 69 ?= 69, «, », 69 ?= 420, «\н»); печать(«Адрес строки: », адрес(«привет»), «\н»); тест_передачи_аргументов_функции(34нат, 35нат); тест_порядка_передачи_аргументов_функции(1нат, 2нат, 3нат, 4нат);