Прокол динамических типов
May. 24th, 2019 11:49 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Когда Никлаус, дай бог ему здоровья, Вирт придумывал Паскаль, то он разрешил использовать процедуры как параметры процедур — чтобы, например, в функцию вычисления интеграла можно было передать функцию, интеграл которой, собственно, вычисляется. Записываться это могло, например, так:
Всё бы хорошо, но только для математических применений. Написать процедуру, которая могла бы принимать процедуры с разными списками аргументов — что может быть полезным при написании компиляторов или интерпретаторов языков программирования, или для других системных приложений — на таком языке нельзя.
Тогда был сделан диалект языка, в котором аргументы формальных параметров-процедур не объявлялись, а соответствие количества и типов параметров проверялось при вызове, и приводило к ошибке периода выполнения при несовпадении. Так был, как говорят, устроен Паскаль-UCSD, и так же устроены Паскали на БЭСМ-6.
А теперь - дискотека!
Ура, работает. Хорошо, тогда попробуем так:
Зацикливается. :)
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.
Зацикливается. :)
no subject
Date: 2019-05-24 09:28 pm (UTC)no subject
Date: 2019-05-25 07:15 am (UTC)no subject
Date: 2019-05-28 07:27 am (UTC)Но в интерпретаторе диагностик о несовпадении типов параметров я что-то не увидел.
no subject
Date: 2019-05-24 10:28 pm (UTC)no subject
Date: 2019-05-25 07:18 am (UTC)no subject
Date: 2019-05-25 02:43 pm (UTC)no subject
Date: 2019-05-28 06:12 pm (UTC)