ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



подпрограммы

Сообщений 1 страница 7 из 7

1

Есть ли в языке возможность оформлять блоки кода как подпрограммы для повторного использования?

А то вот КуМир изначально был интерпретатором, а bash и до сих пор остаётся,
однако и там и там есть подпрограммы.

0

2

Лис написал(а):

Есть ли в языке возможность оформлять блоки кода как подпрограммы для повторного использования?

Сейчас нет.
Думаю реализовать путем вызова подпрограммы из другого файла.
То есть один файл представляет собой одну программу,
которую можно обзывать подпрограммой,
если она вызывается из другой программы.

То есть любая подпрограмма есмь программа,
но не любая программа есмь подпрограмма.

Лис написал(а):

А то вот КуМир изначально был интерпретатором, а bash и до сих пор остаётся,
однако и там и там есть подпрограммы.

В КуМире и баше есть механизм подпрограмм,
так как эти программные продукты разрабатывались большим количеством программистов,
и поддержка подпрограмм была реализована "как везде".

0

3

один файл представляет собой одну программу, которую можно обзывать подпрограммой

Как ты будешь передавать параметры в подпрограмму? Особенно если значение параметра это массив?
А если параметров несколько (и нескольно из них - разные массивы)?

А если надо массив вернуть, то что? А если несколько?

Как различать/сопоставлять/связывать те переменные, которые используются в вызывающей программе,
с переменными из вызываемой подпрограммы?

В принципе, в старых бейсиках были подпрограммы без объявления параметров.
GOSUB <номер-строки> и RETURN.
https://www.qbasic.net/en/reference/qb1 … RETURN.htm

Здесь вместо метки (номера строки) будет имя файла, а вместо RETURN символ конца файла.

Отредактировано Лис (2021-04-13 11:10:11)

0

4

Лис написал(а):

Как ты будешь передавать параметры в подпрограмму?

Никак,
так как нет надобности что-то передавать или принимать,
ибо все переменные будут общими.

Лис написал(а):

Как различать/сопоставлять/связывать те переменные, которые используются в вызывающей программе,
с переменными из вызываемой подпрограммы?

В принципе, в старых бейсиках были подпрограммы без объявления параметров.

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

Вот и в старых бейсиках все переменные общие,
есть лишь один листинг (набор строк).

0

5

NuShaman написал(а):

в старых бейсиках все переменные общие

Им можно, их писали тогда, когда вопрос был менее продуман.

Зачем нужны вообще все эти декларации параметров?
Чтобы создать копии переменных локально. Причём, по умолчанию они должны скопироваться по значению.

Я думаю, что интерпретатор мог бы не сразу копировать, а ждать до первого использования (присвоения).
Тогда была бы возможность исполнить инструкции, описывающие переменные, и
некоторые из переменных скопировать (или даже создать локальные другого типа), а некоторые использовать "насквозь".

надо бы почитать, что делает конструкция "local " в bash, не оно ли это...
https://tldp.org/LDP/abs/html/localvar.html

Отредактировано Лис (2021-04-13 14:17:32)

0

6

Лис написал(а):

надо бы почитать, что делает конструкция "local " в bash, не оно ли это...

Хорошая идея насчет локальной переменной!
В подпрограмме до первого использования переменной
программист должен написать типа "локально ИмяПеременной",
тогда далее переменная ИмяПеременной будет использована локально.
Тогда программировать станет безопаснее для значений переменных.

0

7

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

Считаю, что авторы bash подумали недостаточно (или на них давила необходимость обеспечивать совместимость со старым уже написанным кодом).

0