spamsink: (Default)
[personal profile] spamsink
Когда Никлаус, дай бог ему здоровья, Вирт придумывал Паскаль, то он разрешил использовать процедуры как параметры процедур — чтобы, например, в функцию вычисления интеграла можно было передать функцию, интеграл которой, собственно, вычисляется. Записываться это могло, например, так:

function integ(function f(arg:real):real; low, high: real; steps: integer):real; ... 


Всё бы хорошо, но только для математических применений. Написать процедуру, которая могла бы принимать процедуры с разными списками аргументов — что может быть полезным при написании компиляторов или интерпретаторов языков программирования, или для других системных приложений — на таком языке нельзя.

Тогда был сделан диалект языка, в котором аргументы формальных параметров-процедур не объявлялись, а соответствие количества и типов параметров проверялось при вызове, и приводило к ошибке периода выполнения при несовпадении. Так был, как говорят, устроен Паскаль-UCSD, и так же устроены Паскали на БЭСМ-6.


А теперь - дискотека!
 00001    1  0 PROGRAM MAIN(OUTPUT);
 00007    2  1 PROCEDURE CALLANDPRINT(FUNCTION F:INTEGER);
 00007    3  3 BEGIN
 00015    4  3     WRITELN(F)
 00024    5  2 END;
 00025    6  1 PROCEDURE TODO(PROCEDURE WHATTODO; FUNCTION F:INTEGER);
 00025    7  3 BEGIN
 00034    8  3     WHATTODO(F)
 00034    9  2 END;
 00043   10  1 FUNCTION F:INTEGER;
 00043   11  3 BEGIN
 00051   12  3     F := 12345
 00051   13  2 END;
 00053   14  2 BEGIN
 00054   15  2     TODO(CALLANDPRINT, F)
 00107   16  0 END.
           *EXECUTE
     12345

Ура, работает. Хорошо, тогда попробуем так:
 00001    1  0 PROGRAM MAIN(OUTPUT);
 00007    2  1 PROCEDURE PRINTVAL(I:INTEGER);
 00007    3  3 BEGIN
 00015    4  3     WRITELN(I)
 00020    5  2 END;
 00021    6  1 PROCEDURE TODO(PROCEDURE WHATTODO; FUNCTION F:INTEGER);
 00021    7  3 BEGIN
 00030    8  3     WHATTODO(F)
 00030    9  2 END;
 00037   10  1 FUNCTION F:INTEGER;
 00037   11  3 BEGIN
 00045   12  3     F := 12345
 00045   13  2 END;
 00047   14  2 BEGIN
 00050   15  2     TODO(PRINTVAL, F)
 00103   16  0 END.


Зацикливается. :)

Date: 2019-05-24 09:28 pm (UTC)
vak: (Default)
From: [personal profile] vak
С функцией без параметров F непонятно ведь, то ли вызывать её, то ли передавать как ссылку.

Date: 2019-05-24 10:28 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Насколько я помню, в Паскале был аналог юниона, запись с селектором. Почти ничего не мешает использовать такую запись для перечисления всех возможных аргументов всех потенциальных функций-аргументов. Ну, кроме того, что это получается нерасширяемая вещь в себе, которую не запихнешь в библиотеку.

Date: 2019-05-25 02:43 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Я не про это. Я про то, что у всех процедур, которые будут передаваться как параметр, сделать адинственный аргумент типа этой структуры. И тогда у всех них будет одинаковый тип.
Page generated Jul. 21st, 2025 02:09 pm
Powered by Dreamwidth Studios