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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м (Прочее)
м (Степпер переименовал страницу Введения в функциональный язык программирования Перфо в [[Введение в функциональный язык программирова…)
 
(не показано 13 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
* [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра]
 
* [https://habr.com/ru/company/tinkoff/blog/267015/ предполагается сделать на основе статьи Введение в Scheme с хабра]
 +
 +
Пока самое полное описание синтаксиса смотрите в [[Учебник языка Перфо для школьников]] и в файлах примеров поставляемых вместе с Перфо.
 +
 
== Синтаксис ==
 
== Синтаксис ==
 +
 
Комментарий
 
Комментарий
  
Строка 13: Строка 17:
 
  (Перем НаСчету 500) // Объявляется переменная  и ей присваивается значение 500
 
  (Перем НаСчету 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
  
== Операторы для удобства кодирования ==
+
== Препроцессор ==
=== Область ... Конец области ===
+
* [[Препроцессор языка Перфо]]
Назначение операторов '''Область ... Конец области''' - группировка кода в сворачиваемые области по смыслу. Обозначив кусок кода (сразу '''несколько''' функций, кусок кода внутри функции, описания и т.п.) его можно сворачивать/разворачивать. На панели инструментов в редакторе есть кнопка позволяющая быстро перейти к нужной области по её названию.
 
#Область "Привет, МИР!"
 
...
 
#КонецОбласти
 
  
 
== ссылки ==
 
== ссылки ==
Строка 28: Строка 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

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

ссылки