Введение в функциональный язык программирования Перфо
Материал из ТХАБ.РФ
(перенаправлено с «Введения в функциональный язык программирования Перфо»)
Пока самое полное описание синтаксиса смотрите в Учебник языка Перфо для школьников и в файлах примеров поставляемых вместе с Перфо.
Содержание
Синтаксис
Комментарий
// - комментарии
Пауза
(Пауза)
Имена переменных регистронезависимые, тип переменных определяется компилятором
(Перем НаСчету 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