Именование языковой конструкции: Функция / Перейти - PullRequest
2 голосов
/ 06 апреля 2010

Как называется языковая конструкция со следующими свойствами?

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

  • Вы можете использовать функцию для перехода к ее началу откуда угодно (даже к себе), и она будет выполнять содержащиеся в ней операторы, пока не достигнет своего конца

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

  • Код, который он содержит, находится в той же области видимости, что и все остальные, поэтому вы можете получить доступ ко всем переменным снаружи и создать новые, которые не удаляются при выходе из конструкции.

В целом это похоже на goto точку с окончанием и возможностью возврата туда, откуда она была вызвана.

Ответы [ 4 ]

2 голосов
/ 06 апреля 2010

BASIC имел это, он назывался gosub, и его единственным преимуществом по сравнению с правильной функцией была ваша последняя точка, где все переменные находились в одной области видимости. Помимо этого это отстой.

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

1 голос
/ 06 апреля 2010

Понятие замыкания может быть уместным.

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

Также учтите, что в Perl есть два различных типа переменных области видимости - лексические переменные ("my") и динамические переменные ("local"). Лексические переменные - это локальные переменные, к которым вы привыкли в C, Java и так далее. Динамические переменные видны из любой функции, вызываемой из блока, который их объявил. Поэтому, если все ваши переменные объявлены с local, все функции Perl имеют желаемые свойства.

Во всех случаях я пропустил «создавать новые переменные, которые не уничтожаются при выходе из функции». Это довольно редко, так как предполагает, что переменные, объявленные в функциях, имеют глобальную область видимости, и это не типичный случай в большинстве языков. Обычно вы можете подделать его, имея какой-то глобальный объект и повесив на него что-нибудь, но это редко полезно.

0 голосов
/ 29 мая 2011

Поскольку вопрос помечен как «независимый от языка», я бы добавил, что конструкция subroutines является синонимом конструкции procedures.

Есть некоторые языковые нюансы procedures, например, реализация SQL:

  • имеет изолированную область видимости (чтобы не мешать невинным постоянным переменным);
  • имеет необязательный список аргументов с параметрами IN, OUT или INOUT;
  • ничего не делает return, просто изменяет значения параметров OUT или INOUT;

@ Стив Джессоп Closures - это совсем другой монстр в моей книге.

Хотя они действительно имитируют многие функции procedure, у них есть собственный список аргументов и стек вызовов, что делает их функциями с доступом к внешней области, а не procedure / subroutine.

0 голосов
/ 06 апреля 2010

Из структуры программы я бы назвал это скриптом. Например. сценарий оболочки / пакетной обработки.

Возможно, задача - лучшее название для такой структуры, это может быть скрипт с использованием JavaScript или Perl, который может быть выполнен как есть, просто ссылаясь на сам скрипт.

...