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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м (Окружение)
м (Степпер переименовал страницу Введения в функциональный язык программирования Перфо в [[Введение в функциональный язык программирова…)
 
(не показано 6 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
* [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра]
 
* [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра]
  
Пока более полое описание синтаксиса смотрите в [[Учебник языка Перфо для школьников]]
+
Пока самое полное описание синтаксиса смотрите в [[Учебник языка Перфо для школьников]] и в файлах примеров поставляемых вместе с Перфо.
  
 
== Синтаксис ==
 
== Синтаксис ==
Строка 18: Строка 18:
  
 
== Анонимные (лямбда) - функции ==
 
== Анонимные (лямбда) - функции ==
Используем лямбду без параметров:
+
Объявление анонимной функции:  
 +
функ аналог lambda в Scheme
  
 +
(функ (x) (* x x))    // создать функцию, которая вычисляет квадрат числа
 +
(функ (x y) (+ x y)) // создать функцию, которая вычисляет сумму двух чисел
 +
(перем квадрат (функ (x) (* x x)))  // создать функцию, которая вычисляет квадрат числа и назвать её "квадрат".
 +
(Вывод "Квадрат  = " (квадрат 100) ПС)
 +
 +
//используем лямбду без параметров
 
  (перем ЛЯМ (функ () "значение лямбды"))
 
  (перем ЛЯМ (функ () "значение лямбды"))
 
  (Вывод "Результат (лям) = " (лям) ПС)
 
  (Вывод "Результат (лям) = " (лям) ПС)
  
Используем лямбду с двумя параметрами:
+
//используем лямбду с двумя параметрами
 
 
 
  (перем ЛЯМ2 (функ (х у) (+ х у)))
 
  (перем ЛЯМ2 (функ (х у) (+ х у)))
 
  (Вывод "Результат (лям2 3 5) = " (лям2 3 5) ПС)
 
  (Вывод "Результат (лям2 3 5) = " (лям2 3 5) ПС)
Строка 66: Строка 72:
 
== Циклы в функциональном языке Перфо==
 
== Циклы в функциональном языке Перфо==
  
=== цикл Пока ===
+
=== Цикл Пока. Команда Прервать ===
  (Перем Инд 0)
+
  (Перем Индекс 0)
  (Пока (< Инд 13)
+
  (Пока (< Индекс 13)
     (Если (= Инд 1) ((Вывод "Пропустили 1 с помощью оператора Продолжить!" ПС) (++ Инд) (Продолжить)))
+
     (Если (= Индекс 1) ((Вывод "Пропустили 1 с помощью оператора Продолжить!" ПС) (++ Индекс) (Продолжить)))
     (Вывод "Пока Инд = " Инд пс)
+
     (Вывод "Пока Индекс = " Индекс ПС)
     (++ Инд)
+
     (++ Индекс)
     (Если (= Инд 3) ((Вывод "Сработала команда Прервать!" ПС) (Прервать)))
+
     (Если (= Индекс 3) ((Вывод "Сработала команда Прервать!" ПС) (Прервать)))
 
  )
 
  )
  
=== Цикл Для ===
+
=== Цикл Для ===
 
Реализация цикла Для
 
Реализация цикла Для
 
  (Перем Шаг -1.95)
 
  (Перем Шаг -1.95)
Строка 82: Строка 88:
 
     (Вывод "Для Индекс = " Индекс ПС) // ПС - Перевод Строки
 
     (Вывод "Для Индекс = " Индекс ПС) // ПС - Перевод Строки
 
  )
 
  )
 +
== Множественное ветвление ==
 +
Вариант реализации конструкции 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
  
 
== Препроцессор ==
 
== Препроцессор ==
=== Область ... Конец области ===
+
* [[Препроцессор языка Перфо]]
Назначение операторов '''Область ... Конец области''' - группировка кода в сворачиваемые области по смыслу. Обозначив кусок кода (сразу '''несколько''' функций, кусок кода внутри функции, описания и т.п.) его можно сворачивать/разворачивать. На панели инструментов в редакторе есть кнопка позволяющая быстро перейти к нужной области по её названию. На исполнение программы никак не влияют.
 
#Область "Область данных"
 
...
 
#КонецОбласти
 
  
 
== ссылки ==
 
== ссылки ==

Текущая версия на 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

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

ссылки