Введение в функциональный язык программирования Перфо — различия между версиями
Материал из ТХАБ.РФ
Админ (обсуждение | вклад) м |
Степпер (обсуждение | вклад) м (Степпер переименовал страницу Введения в функциональный язык программирования Перфо в [[Введение в функциональный язык программирова…) |
||
(не показано 16 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
* [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра] | * [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра] | ||
+ | |||
+ | Пока самое полное описание синтаксиса смотрите в [[Учебник языка Перфо для школьников]] и в файлах примеров поставляемых вместе с Перфо. | ||
+ | |||
== Синтаксис == | == Синтаксис == | ||
+ | |||
Комментарий | Комментарий | ||
Строка 9: | Строка 13: | ||
(Пауза) | (Пауза) | ||
+ | Имена переменных регистронезависимые, тип переменных определяется компилятором | ||
+ | |||
+ | (Перем НаСчету 500) // Объявляется переменная и ей присваивается значение 500 | ||
+ | |||
+ | == Анонимные (лямбда) - функции == | ||
+ | Объявление анонимной функции: | ||
+ | функ аналог lambda в Scheme | ||
+ | |||
+ | (функ (x) (* x x)) // создать функцию, которая вычисляет квадрат числа | ||
+ | (функ (x y) (+ x y)) // создать функцию, которая вычисляет сумму двух чисел | ||
+ | (перем квадрат (функ (x) (* x x))) // создать функцию, которая вычисляет квадрат числа и назвать её "квадрат". | ||
+ | (Вывод "Квадрат = " (квадрат 100) ПС) | ||
+ | |||
+ | //используем лямбду без параметров | ||
+ | (перем ЛЯМ (функ () "значение лямбды")) | ||
+ | (Вывод "Результат (лям) = " (лям) ПС) | ||
+ | |||
+ | //используем лямбду с двумя параметрами | ||
+ | (перем ЛЯМ2 (функ (х у) (+ х у))) | ||
+ | (Вывод "Результат (лям2 3 5) = " (лям2 3 5) ПС) | ||
+ | |||
+ | == Область видимости == | ||
+ | Проверим область видимости | ||
+ | |||
+ | (функция (ФА Б) (+ (* Б Б) 25)) | ||
+ | (функция (ФД Б) (+ (ФА (+ Б 1)) (ФА (- Б 1)))) | ||
+ | (Вывод "(ФА 5)=" (ФА 5) пс) | ||
+ | (Вывод "(ФБ 10)=" (ФА 10) пс) | ||
+ | |||
+ | === Присваивание переменной - Функции === | ||
+ | Запомним встроенную функцию * в переменную УМН | ||
+ | (Перем УМН *) | ||
+ | (Вывод "(УМН 2 3 4)=" (УМН 2 3 4) пс) | ||
+ | |||
+ | === Окружение === | ||
+ | Создадим новое окружение и проверим, что переменные созданные в нем не доступны снаружи: | ||
+ | |||
+ | (Окружение | ||
+ | (Перем ВнутрПерем1 1) | ||
+ | (Перем ВнутрПерем2 2) | ||
+ | (Вывод "В окружении (+ ВнутрПерем1 ВнутрПерем2) = " (+ ВнутрПерем1 ВнутрПерем2) пс) | ||
+ | ) | ||
+ | |||
+ | === Встроенные функции === | ||
+ | Проверка встроенных функций: | ||
+ | |||
+ | (Вывод "(ТекущаяДата) = " (ТекущаяДата) пс) | ||
+ | (Вывод "(ТипЗнчСтр ""строка"") = " (ТипЗнчСтр "строка") пс) | ||
+ | (Вывод "(Число? 45.54) = " (Число? 45.54) пс) | ||
+ | (Вывод "(Вещ? 45.54) = " (Вещ? 45.54) пс) | ||
+ | (Вывод "(ТипЗнчСтр 45.54) = " (ТипЗнчСтр 45.54) пс) | ||
+ | (Перем Аня "Девочка Аня гуляет") | ||
+ | (Вывод "(Сред """ Аня """ 9) = " (Сред Аня 9) пс) | ||
+ | (Вывод "(Сред ""Девочка Аня гуляет"" 9 3) = " (Сред Аня 9 3) пс) | ||
+ | (Вывод "(Лев """ Аня """ 7) = " (Лев Аня 7) пс) | ||
+ | (Вывод "(Прав """ Аня """ 6) = " (Прав Аня 6) пс) | ||
+ | |||
+ | == Циклы в функциональном языке Перфо== | ||
+ | |||
+ | === Цикл Пока. Команда Прервать === | ||
+ | (Перем Индекс 0) | ||
+ | (Пока (< Индекс 13) | ||
+ | (Если (= Индекс 1) ((Вывод "Пропустили 1 с помощью оператора Продолжить!" ПС) (++ Индекс) (Продолжить))) | ||
+ | (Вывод "Пока Индекс = " Индекс ПС) | ||
+ | (++ Индекс) | ||
+ | (Если (= Индекс 3) ((Вывод "Сработала команда Прервать!" ПС) (Прервать))) | ||
+ | ) | ||
+ | |||
+ | === Цикл Для === | ||
+ | Реализация цикла Для | ||
+ | (Перем Шаг -1.95) | ||
+ | (Для (Индекс 6.1 0 Шаг) | ||
+ | (Если (< Индекс 1) ((Вывод "Сработала команда Прервать!" ПС) (Прервать))) | ||
+ | (Вывод "Для Индекс = " Индекс ПС) // ПС - Перевод Строки | ||
+ | ) | ||
+ | == Множественное ветвление == | ||
+ | Вариант реализации конструкции SELECT ... CASE | ||
+ | |||
+ | (функция (ПробаЗолота проба) | ||
+ | (если (= проба 999) "Это! 999 проба!" | ||
+ | (если (= проба 750) "Отлично! 750 проба" | ||
+ | (если (= проба 585) "Неплохо! 585 проба" | ||
+ | "Мне неизвестна такая проба..." | ||
+ | ))) | ||
+ | ) | ||
+ | (Вывод (ПробаЗолота 750)) | ||
+ | |||
+ | Пример сделан по аналогии из книги https://www.ohaskell.guide/choose-n-patterns.html | ||
+ | |||
+ | == Конвейерный вызов функций == | ||
+ | |||
+ | конвейерный вызов функций тоже возможен: | ||
+ | (функция(# ф1 ф2 арг) | ||
+ | (ф1 (ф2 арг)) | ||
+ | ) | ||
+ | //обычный вызов 2-х функций | ||
+ | (Вывод (СокрЛП (ВРег " вася ")) пс) | ||
+ | //конвейер | ||
+ | (Вывод (# СокрЛП ВРег " вася ") пс) | ||
+ | |||
+ | Аналог оператора ( . ) из Хаскеля https://www.ohaskell.guide/function-composition.html | ||
− | == | + | == Препроцессор == |
− | + | * [[Препроцессор языка Перфо]] | |
− | |||
− | |||
− | |||
== ссылки == | == ссылки == | ||
Строка 22: | Строка 124: | ||
[[Категория:Язык программирования с синтаксисом Перфолента.NET]] | [[Категория:Язык программирования с синтаксисом Перфолента.NET]] | ||
[[Категория:Перфо.NET]] | [[Категория:Перфо.NET]] | ||
− |
Текущая версия на 12:07, 15 декабря 2022
Пока самое полное описание синтаксиса смотрите в Учебник языка Перфо для школьников и в файлах примеров поставляемых вместе с Перфо.
Содержание
Синтаксис
Комментарий
// - комментарии
Пауза
(Пауза)
Имена переменных регистронезависимые, тип переменных определяется компилятором
(Перем НаСчету 500) // Объявляется переменная и ей присваивается значение 500
Анонимные (лямбда) - функции
Объявление анонимной функции:
функ аналог lambda в Scheme
(функ (x) (* x x)) // создать функцию, которая вычисляет квадрат числа (функ (x y) (+ x y)) // создать функцию, которая вычисляет сумму двух чисел (перем квадрат (функ (x) (* x x))) // создать функцию, которая вычисляет квадрат числа и назвать её "квадрат". (Вывод "Квадрат = " (квадрат 100) ПС)
//используем лямбду без параметров (перем ЛЯМ (функ () "значение лямбды")) (Вывод "Результат (лям) = " (лям) ПС)
//используем лямбду с двумя параметрами (перем ЛЯМ2 (функ (х у) (+ х у))) (Вывод "Результат (лям2 3 5) = " (лям2 3 5) ПС)
Область видимости
Проверим область видимости
(функция (ФА Б) (+ (* Б Б) 25)) (функция (ФД Б) (+ (ФА (+ Б 1)) (ФА (- Б 1)))) (Вывод "(ФА 5)=" (ФА 5) пс) (Вывод "(ФБ 10)=" (ФА 10) пс)
Присваивание переменной - Функции
Запомним встроенную функцию * в переменную УМН
(Перем УМН *) (Вывод "(УМН 2 3 4)=" (УМН 2 3 4) пс)
Окружение
Создадим новое окружение и проверим, что переменные созданные в нем не доступны снаружи:
(Окружение (Перем ВнутрПерем1 1) (Перем ВнутрПерем2 2) (Вывод "В окружении (+ ВнутрПерем1 ВнутрПерем2) = " (+ ВнутрПерем1 ВнутрПерем2) пс) )
Встроенные функции
Проверка встроенных функций:
(Вывод "(ТекущаяДата) = " (ТекущаяДата) пс) (Вывод "(ТипЗнчСтр ""строка"") = " (ТипЗнчСтр "строка") пс) (Вывод "(Число? 45.54) = " (Число? 45.54) пс) (Вывод "(Вещ? 45.54) = " (Вещ? 45.54) пс) (Вывод "(ТипЗнчСтр 45.54) = " (ТипЗнчСтр 45.54) пс) (Перем Аня "Девочка Аня гуляет") (Вывод "(Сред """ Аня """ 9) = " (Сред Аня 9) пс) (Вывод "(Сред ""Девочка Аня гуляет"" 9 3) = " (Сред Аня 9 3) пс) (Вывод "(Лев """ Аня """ 7) = " (Лев Аня 7) пс) (Вывод "(Прав """ Аня """ 6) = " (Прав Аня 6) пс)
Циклы в функциональном языке Перфо
Цикл Пока. Команда Прервать
(Перем Индекс 0) (Пока (< Индекс 13) (Если (= Индекс 1) ((Вывод "Пропустили 1 с помощью оператора Продолжить!" ПС) (++ Индекс) (Продолжить))) (Вывод "Пока Индекс = " Индекс ПС) (++ Индекс) (Если (= Индекс 3) ((Вывод "Сработала команда Прервать!" ПС) (Прервать))) )
Цикл Для
Реализация цикла Для
(Перем Шаг -1.95) (Для (Индекс 6.1 0 Шаг) (Если (< Индекс 1) ((Вывод "Сработала команда Прервать!" ПС) (Прервать))) (Вывод "Для Индекс = " Индекс ПС) // ПС - Перевод Строки )
Множественное ветвление
Вариант реализации конструкции SELECT ... CASE
(функция (ПробаЗолота проба) (если (= проба 999) "Это! 999 проба!" (если (= проба 750) "Отлично! 750 проба" (если (= проба 585) "Неплохо! 585 проба" "Мне неизвестна такая проба..." ))) ) (Вывод (ПробаЗолота 750))
Пример сделан по аналогии из книги https://www.ohaskell.guide/choose-n-patterns.html
Конвейерный вызов функций
конвейерный вызов функций тоже возможен: (функция(# ф1 ф2 арг) (ф1 (ф2 арг)) ) //обычный вызов 2-х функций (Вывод (СокрЛП (ВРег " вася ")) пс) //конвейер (Вывод (# СокрЛП ВРег " вася ") пс)
Аналог оператора ( . ) из Хаскеля https://www.ohaskell.guide/function-composition.html