Тишинуша Гамимеря (spamsink) wrote,
Тишинуша Гамимеря
spamsink

Categories:

Прокол динамических типов

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

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.
Tags: retrocomputing
Subscribe

  • Тьюринг был северный осетин

    СЯУ, что имя Alan (тж. Allan, Allen, и пр.) - не просто омоним демонима жителя Северной Осетии-Алании, и даже не просто когнат, а целый дериват.…

  • Фоносемантическая расстыковка

    ...или семантическое насыщение на новый лад. После того, как я несколько раз произнёс про себя "глоссохронология" и "глоттолалия", я на некоторое…

  • Просто так, амбулаторное

    А вы отдавали себе отчёт, что состояние зомби - это, в сущности, состояние амбулаторной смерти?

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 4 comments