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.
Зацикливается. :)
This entry was originally posted at https://spamsink.dreamwidth.org/1118988.html. Please comment there using OpenID.