Введение в функциональный язык программирования Перфо

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Пока самое полное описание синтаксиса смотрите в Учебник языка Перфо для школьников и в файлах примеров поставляемых вместе с Перфо.

Синтаксис

Комментарий

// - комментарии

Пауза

(Пауза)

Имена переменных регистронезависимые, тип переменных определяется компилятором

(Перем НаСчету 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

Препроцессор

ссылки