БлогNot. Man or boy test

Man or boy test

Чот болею я, в самом прямом смысле, ОРЗ жуткое... Так что какую-нибудь маленькую абстракцию и валиться...

"Man or boy test" - известный тест из Дональда Кнута, когда он оценивал качество компилятора с ALGOL 60, а цель теста была простой - отличить компиляторы, которые правильно реализуют рекурсию и нелокальные ссылки от тех, которые этого не делают. Сам тест и какие результаты должны получаться есть на странице по ссылке.

Из современных массовых языков, наверное, органичней всего на яваскрипте выглядит, но и то неочевидная обёртка понадобилась, чтобы победить "тяжёлое наследие си-подобных языков":

<script type="text/javascript">
function a(k, x1, x2, x3, x4, x5) {
  function b() {
    k--;
    return a(k, b, x1, x2, x3, x4);
  }
  return (k > 0) ? b() : x4() + x5();
}
 
//обёрточка, без неё может и не выйти :)
function x(n) {
 return function () { return n; };
}

alert(a(10, x(1), x(-1), x(-1), x(1), x(0)));
</script>

Но ведь и на PHP будет в данном случае почти так же выразительно:

<?php
function A($k,$x1,$x2,$x3,$x4,$x5) {
 $b = function () use (&$b,&$k,$x1,$x2,$x3,$x4) {
  return A(--$k,$b,$x1,$x2,$x3,$x4);
 };
 return $k <= 0 ? $x4() + $x5() : $b();
}  
 
echo A(10, 
 function () { return  1; },
 function () { return -1; },
 function () { return -1; },
 function () { return  1; }, 
 function () { return  0; });
?>

Наверное, и на Питоне тоже.

А на "плюсах", "шарпе" или яве, конечно, куда более замудрённый класс понадобится...

20.09.2018, 21:49 [2017 просмотров]


теги: программирование javascript php тест

К этой статье пока нет комментариев, Ваш будет первым