Этюд для программистов
May. 2nd, 2012 02:54 pmУ меня не получилось. То ли мартышка к старости слаба мозгами стала, то ли действительно не выйдет.
Вскоре после изобретения Алгола-60 Дональд Кнут придумал ради проверки корректности компиляторов такой камень, который сам не смог поднять - Man or Boy Test. Правильно вычислить, что напечатает эта программа, ему не удалось:
(он думал -121, а на самом деле -67)
На сайте Rosetta Code переписали этот тест на множество разных языков, а вот статического варианта на C++ (в котором все вычисления делал бы компилятор при отработке templates) там нет. По ссылке видно, что "чистым" языкам типа Haskell и OCaml требуются трюки для модификации переменной k. С первого взгляда кажется, что С++ templates настолько чисты, что в них такой трюк невозможен. Или я чего-то в С++ не знаю/недопонимаю?
Безотносительно к задачке, сайт http://rosettacode.org может пригодиться.
Вскоре после изобретения Алгола-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 может пригодиться.
no subject
Date: 2012-05-03 01:52 am (UTC)увы, монад я не освоил, и понятия не имею, что мешает (или не мешает) вбить их в С++ темплейты.
no subject
Date: 2012-05-03 06:24 am (UTC)Объясни как x1 - x5 может быть "reference to the function B"? Этот момент не понятен.
no subject
Date: 2012-05-03 06:36 am (UTC)