spamsink: (Default)
[personal profile] spamsink
У меня не получилось. То ли мартышка к старости слаба мозгами стала, то ли действительно не выйдет.


Вскоре после изобретения Алгола-60 Дональд Кнут придумал ради проверки корректности компиляторов такой камень, который сам не смог поднять - Man or Boy Test. Правильно вычислить, что напечатает эта программа, ему не удалось:
begin
  real procedure A(k, x1, x2, x3, x4, x5);
  value k; integer k;
  begin
    real procedure B;
    begin k := k - 1;
          B := A := A(k, B, x1, x2, x3, x4);
    end;
    if k <= 0 then A := x4 + x5 else B;
  end;
  outreal(A(10, 1, -1, -1, 1, 0));
end;

(он думал -121, а на самом деле -67)

На сайте Rosetta Code переписали этот тест на множество разных языков, а вот статического варианта на C++ (в котором все вычисления делал бы компилятор при отработке templates) там нет. По ссылке видно, что "чистым" языкам типа Haskell и OCaml требуются трюки для модификации переменной k. С первого взгляда кажется, что С++ templates настолько чисты, что в них такой трюк невозможен. Или я чего-то в С++ не знаю/недопонимаю?


Безотносительно к задачке, сайт http://rosettacode.org может пригодиться.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting
Page generated Mar. 5th, 2026 07:53 am
Powered by Dreamwidth Studios