Переменная Result в функции
Реализация языка в версии Object Pascal облегчает программирование функций путем автоматического объявления в каждой из них локальной переменной Result. Эта переменная имеет тот же тип, что и результат функции. Присваивание значения переменной Result аналогично определению значения функции. Преимущество использования этой переменной при вычислении значения функции в том, что локальная переменная Result может стоять в правой части оператора присваивания и не вызывает при этом рекурсивного вычисления функции (в отличие от идентификатора функции, появление которого в вычисляемом выражении означает рекурсивный вызов функции).
Например, представленная выше функция вычисления суммы квадратов натурального ряда может быть преобразована следующим образом: 

Заметим, что уменьшилось количество локальных переменных, необходимых для реализации алгоритма, и сам алгоритм стал короче на один оператор.
Формальные и фактические параметры
Объявление процедуры или функции содержит список формальных параметров. Каждый параметр из списка формальных параметров является локальным по отношению к процедуре или функции, для которой он объявлен. Это означает, что глобальные переменные, имена которых совпадают с именами формальных параметров, становятся недоступными для использования в процедуре или функции.
Отдельные объявления параметров в списке разделяются точкой с запятой. Синтаксис списка формальных параметров следующий:

Все формальные параметры можно разбить на две категории:
- • параметры, вызываемые подпрограммой по своему значению (т. е. параметры, которые передают в подпрограмму свое значение и не меняются в результате выполнения подпрограммы);
- • параметры, вызываемые подпрограммой по наименованию (т. е. параметры, которые становятся доступными для изменения внутри подпрограммы).
Главное различие этих двух категорий — в механизме передачи параметров в подпрограмму. При вызове параметра по значению происходит копирование памяти, занимаемой параметром, в стек и использование в дальнейшем в операторах подпрограммы локальной копии параметра. Основное значение параметра
(глобальное по отношению к подпрограмме) при этом остается без изменения. Следует отметить, что использование такого механизма при передаче, например, массивов большой длины может отрицательно влиять на быстродействие программы и заполняет стек лишней информацией.
При вызове параметра по наименованию в процедуру передается адрес памяти (глобальной по отношению к подпрограмме), в которой размещено значение параметра, и в качестве локальной переменной выступает ссылка на глобальное размещение параметра, обеспечивающая доступ к самому значению.
Объявление формального параметра обязательно содержит имя (идентификатор) параметра и, как правило, его тип, отделяющийся от имени двоеточием. Несколько однотипных параметров могут объединяться в одно объявление. При этом их имена перечисляются через запятую.
При обращении к подпрограмме формальные параметры заменяются на соответствующие по типу и категории фактические параметры вызывающей программы или подпрограммы.
Параметры-значения. Формальные параметры-значения относятся к первой из перечисленных выше категорий и действуют как переменные, локальные по отношению к процедуре или функции. Изменения формальных параметров-значений не влияют на значения соответствующих фактических параметров. Синтаксис объявления параметра-значения следующий:

Фактический параметр, соответствующий параметру-значению в операторе процедуры или вызове функции, должен быть выражением, а его значение не может быть файлового типа. Фактический параметр должен быть совместим по присваиванию с типом формального параметра-значения.
Рассмотрим пример объявления функции с параметром-значением: 

Параметры-переменные. Формальные параметры-переменные относятся ко второй категории параметров и служат для модификации внутри подпрограммы значений соответствующих фактических параметров. Формальный параметр-переменная представляет фактическую переменную во время выполнения процедуры или функции, поэтому все изменения значения формального параметра отражаются на фактическом параметре. Синтаксис объявления параметров-переменных следующий:

Внутри подпрограммы любое упоминание формального параметра-переменной обеспечивает доступ к самому фактическому параметру. Тип фактического параметра должен быть тождественен типу формального параметра-переменной (это ограничение можно обойти через использование параметров-переменных без типа). Файловые типы могут передаваться только как параметры-переменные.
Рассмотрим пример объявления процедуры с параметром-переменной:

В результате применения этой процедуры к строке
S_Sentence: 
будет изменено содержимое строки. Если до вызова процедуры в строке находилось значение ‘лимон, апельсин, банан’, то после вызова процедуры значение s_Sentence будет равно ‘лимон; апельсин; банан’.
Как видно из синтаксической формулы, объявление параметров-переменных может не сопровождаться указанием типа. Когда формальный параметр является параметром-переменной без типа, соответствующий фактический параметр может быть переменной любого типа, а ответственность за правильность использования параметра ложится при этом на программиста.
Внутри процедуры или функции такой параметр-переменная не имеет типа, то есть он не совместим с переменными всех других типов до тех пор, пока ему не присвоен определенный тип.
Рассмотрим пример передачи параметров-переменных без типа:

Эту функцию можно использовать для сравнения любых двух переменных, размер которых не превышает 1000 байт. Например, в программе присутствуют следующие объявления: 
Тогда вызов функции:
VarEqual(Vectorl, Vector2, SizeOf(Vector))
обеспечит сравнение массивов Vectorl и Vector2;
VarEqual(Vectorl, Vector2, SizeOf(Integer)*10) —
сравнение первых 10 элементов массивов Vectorl и Vector2;
Equal(Pointl, Point2, SizeOf(TPoint)) —
сравнение переменных Pointl и Point2;
Equal(Vectorl[1], Point2.Y, SizeOf(Integer)) —
сравнение значений Vectorl [ 1 ] и Point2. Y.
Параметры-константы. Формальные параметры-константы носят пограничный характер между двумя категориями. С одной стороны, это параметры, которые передаются в подпрограмму по наименованию, т. е. ссылкой на глобальное размещение фактического параметра, но, с другой стороны, внутри подпрограммы действует запрет на изменение значения параметра. Использовать параметры-константы удобно вместо параметров-значений, когда параметр характеризуется большим размером занимаемой памяти. Параметры-константы введены в описание языка только начиная с версии Turbo Pascal 7.0. Синтаксис объявления параметров-констант следующий:

В рассмотренном ранее примере объявления функции с параметром-значением более эффективным будет использование параметра-константы, который обеспечит передачу в процедуру адреса размещения строки: 
Аналогично объявлению параметров-переменных в объявлении параметров-констант может отсутствовать указание типа. В этом случае фактический параметр может быть переменной любого типа, и использование его внутри подпрограммы предполагает предварительное преобразование к конкретному типу.
Result в Паскале
Слово Result в Паскале в используется для возврата результата из функции.
Как известно, любая функция возвращает какой-то результат. Обычно в Паскале это делается так:
То есть где-то в теле функции (обычно в конце, после выполнения всего кода функции) мы пишем имя функции, используя его как идентификатор переменной, и присваиваем ей какое-то значение.
Таким образом в нашем примере функция MyFunc вернёт результат — квадрат числа Х. Если в программе мы вызовем нашу функцию, например, так:
то на экран будет выведено число 100.
Впрочем, всё это вы уже должны знать.
А вот эту фишку многие новички не знают:
Обратите внимание, что здесь вместо имени функции мы пишем слово Result.
И функция будет работать точно также. То есть возвращать результат, как это и положено функции.
Прекрасно. Но остаётся вопрос — зачем это надо?
Вот это то и есть основная тема данной статьи. Здесь я покажу вам две причины, почему и когда лучше использовать именно слово Result, а не имя функции для возврата результата.
Причина первая
Довольно часто в практике программирования приходится создавать похожие функции. При этом обычно полностью копируется исходная функция. А затем немного дорабатывается и переименовывается.
Если вы используете такой формат:
function MyFunc(x : integer) : integer; begin MyFunc := x * x; end;
То вам придётся переименовывать функцию не менее чем в двух местах. Если же вы используете слово Result, то вам надо будет переименовать функцию только в одном месте — в заголовке.
Да. Но, как говорится, дьявол кроется в мелочах. И профессионал отличается от любителя именно отношением к мелочам.
Кроме того, при копировании функции, как правило, мы переименовываем её в заголовке, но часто забываем сделать это там, где функция возвращает результат.
Компилятор, конечно, в этом случае выдаёт ошибку. Но перед этим вы тратите время на компиляцию. И время течёт буквально сквозь пальцы.
Например, в то время, как я пишу эту статью, я занимаюсь разработкой довольно сложной программы, на что у меня уже ушло 250 часов. И ещё уйдёт примерно столько же.
А теперь представьте, что с помощью разных фишек вам удастся сэкономить хотя бы одну минуту из часа и помножьте это на общее количество часов. Цифра будет немаленькой. А ведь это ваше время!
Причина вторая
Вторая причина перекликается с первой. Связана она тоже с возможной необходимостью переименования функции (это может потребоваться по разным причинам).
Представьте, что у вас есть такая функция:
И представьте, что вы решили её переименовать.
В этом случае вам придётся переименовать все идентификаторы в селекторах конструкции case.
В нашем примере их три. Но ведь может быть и 100 и более.
А если бы вы использовали слово Result, то вам опять же надо было бы переименовать только заголовок.
Конечно, в редакторе исходного кода есть такие вещи как поиск и замена, но ведь и их использование тоже отнимает время.
В общем, надеюсь, я убедил вас в полезности использования слова Result в Паскале. Применяйте эту замечательную возможность и, поверьте, это избавит вас от множества неприятностей и позволит сэкономить время на разработку программ.
Бот Телеграм на PHP
Примеры как зарегистрировать бота в Telegram, описание и взаимодействие с основными методами API. Документация на core.telegram.org и tlgrm.ru (неофициальный, на русском).
Все запросы к API должны осуществляться по HTTPS, подойдет бесплатный сертификат «Let’s Encrypt».
Регистрация бота
Для регистрации нового бота нужно написать «папе ботов» @BotFather команду /newbot
Следующим сообщением отправляем название для бота, обязательно на конце имени должно быть слово «bot» или «_bot». Ответным сообщением получим токен:
Тут же можно настроить описание и аватарку:
| /setname | Имя |
| /setdescription | Краткое описание |
| /setabouttext | Описание бота |
| /setuserpic | Юзерпик |
Далее нужно поставить «Webhook» чтобы все сообщения из Telegram приходили на PHP скрипт ( https://example.com/bot.php ). Для этого нужно пройти по ссылке в которой подставлены полученный токен и адрес скрипта.
https://api.telegram.org/bot <token> /setWebhook?url= https://example.com/bot.php
В ответе будет
При смене токена, установку вебхука нужно повторить.
Входящие сообщения
Сообщения приходят POST-запросом, с типом application/json . Получить его в PHP можно следующим образом: