• Безымянный 222304

  • Яма плюс - справочьник - кусок 10

  • // куски справочьника ...

    // Процэдуры (и функцыи), Аргументы и параметры, Рекурсия
    // ----------------- 13

    Что есть процэдура и как она выглядит.
    Важно осознать термины "вызов процэдуры" и "тело процэдуры".
    Где-то есть блок кода, который оформлен как отдельный станок - это "тело процэдуры".
    А есть строчьки кода, в которых мы хотим срабатывания нужного "станка" - вызываем
    процэдуру. При каждом вызове, тело нужной процэдуры создаётся в оперативной памяти
    и маркер исполнения програмы попадает на этот станок и пытается исполнять его код.
    Как только исполнит, то станок само-уничьтожается, а маркер продолжает исполнять
    код с места сразу после вызова той процэдуры.
    "Вызов процэдуры" это станок, чертежом которого является "тело процэдуры".

    название_процэдуры( аргумент1, арг2); // так выглядит "вызов процэдуры".

    проца название_процэдуры( чи8 параметр1, чи8 !! па2)
    {
      параметр1 += па2;
    }
    // 4 строки вышэ - так выглядит простое "тело процэдуры" (простейшый чертёж).
    В даном случие, "параметр1" является синонимом внешней переменки "аргумент1".
    То что мы пытаемся засунуть в процэдуру в строке вызова процэдуры - это Аргументы.
    А локальные названия поступаюшей извне информацыи - это Параметры (список параметров).
    Запятая разделяет и параметры и аргументы.
    Параметр процэдуры чясто является "локальной переменкой". В примере вышэ, "па2"
    создаётся и значит "арг2" не попал внутрь процэдуры, а лиш передал своё содержымое
    новой локальной переменке "па2".
    А вот "аргумент1" попал внутрь под псевдонимом "параметр1" и если "па2" не хранит ноля,
    то содержымое "аргумент1" явно изменится (чего мы и ожыдали от вызова этой процэдуры).

    Важно понять и привыкнуть к принцыпам процэдур, потому-что в этом сила програмирования.

    Имена нормальных процэдур и глобальные переменки всегда находятся в оперативной памяти,
    поэтому их названия можно упоминать в любом теле процэдур.
    проца название( ) // пустой "список параметров"
    {
      глобалка1 += 1; // мы не передавали эту переменку внутрь, но можэм изменить её здесь.
      некая_проца( глобалка1); // вызываем какую-то нормальную процэдуру.
    }
    Дажэ если переменка является "глобалкой" и везде доступна, то уместо её подавать
    внутрь процэдуры как аргумент-параметр.
    Не-нормальными процэдурами можно считать "процэдуры-принадлежности механизмов".
    // Про механизмы инфа будет в отдельной чясти справочьника.

    Имена переменок не должны повторять имена процэдур.
    Однако есть случий краткой записи "конструктора механизмов", когда при создании
    нового экзэмпляра механизма рядом с его названием в круглых скобках указываются
    аргументы для правильного создания такого механизма.
    Простые типажы тожэ повторяют этот принцып, чтобы не портить обшюю картину.
    чи31!! число(23); // краткая версия // указание названия и вызов конструктора.
    чи31!! число||(23); // полная версия записи конструктора - идэнтичьно строке вышэ.
    тип1!! колесо; // создание без конструктора - используется нечьто умолчятельное.
    тип2!! трактор(колесо); // размножаем и прикручиваем к трактору такие колёса.
    тип2!! трактор||(колесо); // эквивалент строке вышэ.
    // Знак "две палочьки" можно называть "конструктор".
    Чтобы не мозолить глаза лишними палочьками, уместно после названия сразу печятать
    круглые скобки. Визуализацыя скобок в Маргинале будет разно-образной.

    // для тех кто знает "Си плас плас"..
    Пока запрешены процэдуры с одинаковыми именами и разными "списками параметров".
    Это путает мозги и не даёт явной выгоды, потому-что "процэдуры всё-равно разные".
    Если процэдура "для всех одинаковая", то просто можно пихать в неё вмеру похожый
    аргумент и всё будет правильно.
    Если процэдура использует внутри сложэние, тогда фло32 и чи8 будут похожыми.
    Результат (цэлое или дробное) будет зависеть от типажа "получятеля сложэния".

    //
    Вызов процэдуры полностью зависит от схемы-тела процэдуры.
    Пробуем усвоить полную схему построения тела процэдуры..
    | место1  место2  место3  место4
    | место5
    | место6
    \----------------------------------------------/

    Теперь перечислим возможные варианты написания каждого из мест.
    - место1..
    Здесь указываем типаж "возврашяемого результата" без дополнительных знаков.
    Это место можэт быть полностью пустым (тогда чертёж начьнётся с "место2").
    А если типаж указан, то процэдуру можно называть термином "функцыя", и вызов
    такой процэдуры можно использовать для получения значений из некой рутины.
    //примеры.. чи31, фло64, свой_тип1.

    - место2..
    Обязательное место и здесь одно из ключевых слов..
    проца, проца1, проца2, оператор.
    Основной вариант это "проца".
    Если нам нужно сделать пару процэдур, у которых вызовы идут в обязательном порядке,
    тогда добавляем единицу или двойку. И "проца1" всегда как-бы открываюшяя скобка,
    а "проца2" закрывает подразумеваемый блок. Авто-помошник внимательно следит за подобным.
    Слово "оператор" используем, если хотим обозначить название процэдуры неким "знаком",
    например, знаком плюсика или умножэния (для сокрашения пропечятки чястых вызовов).

    - место3..
    Здесь распологается название процэдуры, которое в особом случие можэт быть "значьком".
    //примеры.. читаем.текст, +, Титул;

    - место4..
    Список параметров. Как-минимум должны быть две круглых скобки ( ). //открытие-закрытие
    Между этими скобками через запятую идёт перечисление параметров процэдуры.
    Скобки могут быть пустыми или могут содержать один параметр, или много параметров.
    Параметром можэт быть ключевое слово "формацыя" или мини-описание ожыдаемого аргумента.
    //подробнее про тему "список параметров" чють нижэ.

    - место5..
    Блок кода, который и является смыслом процэдуры.
    Обязательно наличие двух фигурных скобок { }. //открытие и закрытие
    Весь код процэдуры обязан быть между фигурными скобками, которые идут после круглых.
    Если кода нет, то это нормально, но авто-пом будет иногда напоминать, что для
    придания осмыслености надо-бы что-то записать внутри тела процэдуры.
    Если процэдура является "библиотечьной", то между скобок ключевое слово "БИБ"
    и самого кода такой процэдуры увидеть нельзя. (блок из библиотеки)
    // чи31 проца название( чи31 а1, фло32 а2) { БИБ }

    - место6..
    Здесь особое указание (напутствие) по использованию процэдуры.
    Пока всего два варианта (два ключевых слова).. "лимит" и "реакцыя".
    Любой из вариантов требует в концэ пропечятки "завершэния выражэния" (точка-запятая).

    проца некое.действо()
    {} лимит 1; // означяет, что "вызов процы" можно вписать где-то в коде лиш раз.

    проца некое_действо() // это название считается отличьным от "некое.действо".
    {} реакцыя; // означяет учястие в Проц-реакторе - эту процу можно в скриптах вызывать.
    // "реакцыя" не можэт быть одновремено с "лимитом", потому-что смысл у них разный.

    -------------
    Прерывание исполнения процэдуры и возврашяемый результат..
    Ключевое слово "итог" заставляет Маркер исполнения програмы покинуть текушюю процэдуру
    (прыгнуть к закрываюшей фигурной скобке тела этой процэдуры).

    проца название_процы( чи31!! А)
    { п( ! А) итог; // прерываем процэдуру, если параметр "А" хранит ноль.
      что_то_сделать( ); // Если не прервали, то исполним вызов некой другой процэдуры.
    }

    Если процэдура возврашяет некий результат, тогда "возврашяемое" нужно ставить справа
    от слова "итог" (жэлательно, не усложнять выражэние).
    Авто-помошник пытается контролировать использование этого слова, чтобы сократить ошыбки.
    чи31 проца название_процы2( чи31!! А)
    {
      п( ! А) итог 0; // возврат ноля, может говорить, что исполнение процэдуры сорвалось.
      что_то_сделать( );
      итог 1; // в самом концэ процэдуры обязательно указать "какой-нибудь результат".
      //итог правда; //эквивалент единицэ.
    }

    Предпологается, что любой возврашяемый результат является значением и оно (значение)
    попадает "в готовую переменку" или "в никуда".
    чи31!! энУспех = название_процы2( 25); // результат попал в переменку "энУспех".
    название_процы2( 25); // результат просто игнорируется при вызове процэдуры.

    Прогер можэт вносить текст вызова процэдур без круглых скобок и авто-пом поставит их
    где надо и оставит без скобок там, где выражэние обходится без скобок.
    вернули кви; // здесь ключевое слово подобно процэдуре, но скобки не обязательны.
    // У всех простых "названий процэдур", скобки считаются обязательными.

    Можно возврашять из процэдуры Адрес и авто-пом будет пытаться блокировать ошыбки,
    когда програмист пытается вернуть адрес локальной переменки. Локальные переменки
    исчезают как только процэдура прерывается или маркер доходит до её конца.
    @чи31 проца название_процы3( чи31!! А)
    {
      итог @А; // ошыбка - параметр создан внутри процэдуры.
    }
    @чи31 проца название_процы4( чи31 А)
    {
      итог @А; // параметр является синонимом - тоесть останется жыть после этой процэдуры
      // и полученый адрес будет актуален после вызова этой процэдуры.

    }

    чи31 проца название_процы5( )
    {
      чи31!! А = 2;
    // итог А * 2.5; // вернут результат 5.
      итог А * 2.6 + 3; // вернут результат 8.

    // итог ( А * 2.5 + 3); // просто пере-страховка.
    // итог чи31( А * 2.5 + 3); // излишняя пере-страховка без смысла.

    }
    чи31 проца название_процы6( )
    { // пример, где отдельно вычисляем сложное выражэние, а потом "краткий и ясный итог".
      чи31!! А = 2;
      чи31!! Р = сложное_выражэние + А;
      итог Р; // итог рэ.
    }

    Прогер можэт оформить коментарий-врезку со спец словами аля требованием
    некого визаульного пресета для оформления рисования параметров и аргументов ...
    проца название_ы3( чи31!! ля /* кб.цвет.рамы( красный); */, чи31!! ми) { }
    // Коментарный_браузик во врезке - значит "ля" будет в красной рамке.

    /*
    Например, все быстрые процэдуры должны рисовать аргументы (вызов процы) в красной
    рамочьке, потому-что эти аргументы-параметры внутри процэдуры не проверяются.

    Мы должны перед вызовом процэдуры проверить эти аргументы - вероятно в коментариях
    к той процэдуре написано какие имено внешние проверки рекомендуется делать.
    Например, отличие от ноля или попадание в некий интервал чисел.
    */

    Список параметров (подробности)..
    Между круглых скобок указываем перечень параметров (через запятую).
    Каждый параметр состоит из указания типажа и "локального названия параметра"
    внутри тела процэдуры. // Есть пара исключений, когда параметр это "одно ключевое слово".
    Между типажом и названием можно разместить знак "Создания переменки".
    После названия параметра можно напечятать ключевое слово "гость".
    (чи8 !! переменка1) // создаём локальную переменку и получяем в неё значение аргумента.
    (чи8 нечьто1)      // "нечьто1" это синоним внешнего имени (синоним названия аргумента).
    (чи8  нечьто1  гость) // значение в контэйнере "нечьто1" не изменится внутри процэдуры.
    // В последнем примере "нечьто1" такжэ является "синонимом".

    Принадлежность "списку параметров процэдуры".
    Пробел, дву-точие, название_параметра, пробел, аргумент - так можно подавать аргумент в процу.
    Таким образом можно заполнять любые параметры в любой последовательности.

    Можно игнорировать любые параметры для которых указано "умолчятельное значение"
    и которые не являются передачей "как синоним".

    //проца ктысь( чи31 сам.педро, чи8!! байтуха = 0, чи16!! шортуха){} // ошыбка шортуха.
    проца ктысь( чи31 сам.педро, чи8!! байтуха = 0, чи16!! шортуха = 0){} // правильно.

    //ктысь( ); // ошыбка вызова - обязателен первый аргумент.
    ктысь( некий_педро); // правильно.
    ктысь( некий_педро, 0, 0); // эквивалент верхней строке.
    ктысь( некий_педро, ..байтуха 0, ..шортуха 0); //эквивалент

    ктысь( некий_педро, , 5); // правильно.
    ктысь( ..сам.педро некий_педро, ..шортуха 5); // эквивалент верхней строке.
    ктысь( ..шортуха 5, ..сам.педро некий_педро); // эквивалент
    //ктысь( ..шортуха 5, ..сам.педро 24); // ошыбка - "педро" должэн быть названием контэйнера.

    ктысь( некий_педро, ..шортуха 5, ..байтуха некая_переменка); // правильно.

    //
    Рекурсивные вызовы процэдур.
    Когда в теле процэдуры используется вызов этой-жэ процэдуры, то это "рекурсия".
    Как-бы станок этой процэдуры сохраняется и создаётся новый подобный станок
    и он тожэ сохранится и будет создан новый подобный станок и он тожэ сохранится
    и будет создан новый подобный станок и, наконец, какое-то условие в теле процэдуры
    позволит обойти "создание нового подобного станка" - все станки постепено отхлынут
    обратно в никуда. А если рекурсия будет бесконечьной, то компьютер, вероятно,
    исчерпает возможности создания новых станков и зависнет.
    Поэтому процэдуры с рекурсией нужно планировать особым образом, чтобы "прерывание"
    было ясным и логичьным.
    // При экспорте, Авто-помошник можэт вставлять свои прерыватели-предо-хранители.

    В языке "яма плюс" пока НЕЛЬЗЯ использовать "получение" при вычислении аргумента.
    // некая_процэдура( 33, xикс += 1 ); // ошыбка
    // некая_процэдура( 33, угрик = 1 + 2 ); // ошыбка

    Нельзя "ставить" доступ к свойствам механизма "от голого результата".
    функцыя_ы( а, б)..работа_механизма(); // ошыбка
    эн_тип !! эн2 = функцыя_ы( а, б); эн2..работа_механизма(); // Так правильно.
    // Авто-помошник сам оптимизирует при экспорте, если возможно.

    "Яма плюс" гарантирует последовательное исполнение вычисления аргументов
    всегда "слева направо" (в порядке упоминания аргументов).
    чи31 проца подправить( чи31 а) { а += 1; итог а;} //тело процэдуры-функцыи.
    проца некая_процэдура( чи31!! парам1, чи31!! парам2 ) { } //тело пустой процэдуры.

    чи31!! хикс = 3; //тэстовая переменка.
    некая_процэдура( подправить(хикс), подправить(хикс) ); //тэстовые вызовы.
    //некая_процэдура( 4, 5 ); //эквивалент верхней строке.

    некая_процэдура( ..парам2 подправить(хикс), ..парам1 подправить(хикс) );
    //некая_процэдура( 5, 4 ); //эквивалент верхней строке.

    // финиш кусок 13
     



























































































































































































  • Безымянный 222304

  • Яма плюс - справочьник - кусок 10