php/e19Closure.php
<?php
require_once('env.php');
outBegin("php closure");
outH('call functions');
outUL('before first call');
outLi("function_exists", function_exists('inF'));
f('1. call von f');
echo "<li> function_exists " . function_exists('inF') . "</li>\n";
inF('2. call von inF');
$gVar = 'gVarEins';
$gArr = ['gArr 0'];
$af = function ($a) use ($gVar, $gArr) {
outLi("call of anonymous function in af($a) use gVar = $gVar, gArr[0] $gArr[0] count=" . count($gArr));
};
$ag = function ($a) {
global $gVar, $gArr;
outLi("call of anonymous function in ag($a) global gVar = $gVar, gArr[0] $gArr[0] count=" . count($gArr));
};
$af("3. call af");
$ag("4. call ag");
$gVar = 'gVarZwei';
$gArr[0] .= " zwei";
$gArr[1] = "1 zwei";
$af("5. call af nach assign gVar=$gVar");
$ag("6. call ag nach assign gVar=$gVar");
outULEnd("after last call");
outH('nested function');
outUL();
$nestCnt = 0;
$q1 = nest('nestOne');
$q1[0]('mainCalls' . ++$nestCnt);
$q1[1]('mainCalls' . ++$nestCnt);
$q2 = nest('nestTwo');
$q1[0]('mainCalls' . ++$nestCnt);
$q2[1]('mainCalls' . ++$nestCnt);
$q1[1]('mainCalls' . ++$nestCnt);
$q2[0]('mainCalls' . ++$nestCnt);
outULEnd();
function f ($a) {
outLi("call of f($a)");
function inF($b) {
outLi("call of inF($b)");
}
}
function nest ($a) {
global $nestCnt;
outLi("runNest($a)", ++$nestCnt);
$v = "useVal $a $nestCnt:";
$r = "useRef $a $nestCnt:";
$q = [function ($b) use($a, $v ,&$r) {
global $nestCnt;
outLi("run-$a-NestB($b)" , ++$nestCnt, "v=$v, r=$r, appending B$nestCnt");
$v .= ".B$nestCnt";
$r .= ".B$nestCnt";
},
function ($b) use($a, $v ,&$r) {
global $nestCnt;
outLi("run-$a-NestC($b)" , ++$nestCnt, "v=$v, r=$r, appending C$nestCnt");
$v .= ".C$nestCnt";
$r .= ".C$nestCnt";
}
];
outLi("nest($a)", ++$nestCnt, "v=$v, r=$r, appending n$nestCnt");
$v .= ".n$nestCnt";
$r .= ".n$nestCnt";
$q[0]('nestCalls#' . ++$nestCnt);
outLi("nest($a)", ++$nestCnt, "v=$v, r=$r, appending n$nestCnt");
$v .= ".n$nestCnt";
$r .= ".n$nestCnt";
$q[1]('nestCalls#' . ++$nestCnt);
outLi("nest($a)", ++$nestCnt, "v=$v, r=$r");
return $q;
}
outH('church numerals');
outTB();
tr("?", function($l, $r) {return "$l ? $r"; }, 'outTH');
function p1($x) { return ++$x; }
function n0 ($f, $z) { return $z; }
function n1 ($f, $z) { return $f($z); }
function n2 ($f, $z) { return $f($f($z)); }
$num = ['n0', 'n1', 'n2'
, function ($f, $z) {return $f(n2($f,$z));} , function ($f, $z) {return $f($f(n2($f, $z)));} ];
tr("num[r]", function($l, $r) {global $num; return "$r -> " . call_user_func($num[$r], 'p1', 0);});
function scc($a) { return function($f, $x) use ($a) {return $f($a($f, $x)); } ; }
function add($l, $r) { return function($f, $x) use ($l, $r) {return $l($f, $r($f, $x)); } ; }
function mult($l, $r) { return function($f, $x) use ($l, $r) {return $l(
function($y) use ($l, $r, $f) { return $r($f, $y); }
, $x); } ; }
function mulA($l, $r) { return function($f, $x) use($l, $r) { return $r(aL($l), 'n0')($f, $x); } ; }
function powr($l, $r) { return function($f, $x) use($l, $r) { return $r(
function($v) use($l) { return mult($l, $v);}, 'n1')($f, $x); } ; }
function powM($l, $r) { return function($f, $x) use($l, $r) { return $r(mL($l), 'n1')($f, $x); } ; }
tr("scc(r)", function($l, $r) {global $num; return "$r -> " . scc($num[$r])('p1', 0);});
outTCF('l', 'r');
tr("add(l, r)", function($l, $r) {global $num; return add($num[$l], $num[$r])('p1', 0);});
tr("mult(l, r)", function($l, $r) {global $num; return mult($num[$l], $num[$r])('p1', 0);});
tr("mulA(l, r)", function($l, $r) {global $num; return mulA($num[$l], $num[$r])('p1', 0);});
tr("powr(l, r)", function($l, $r) {global $num; return powr($num[$l], $num[$r])('p1', 0);});
tr("powM(l, r)", function($l, $r) {global $num; return powM($num[$l], $num[$r])('p1', 0);});
outTBEnd();
outEnd(__file__);
function aL($l) { return function($r) use($l) {return add($l, $r); } ; }
function mL($l) { return function($r) use($l) {return mult($l, $r); } ; }
function tr($h, $f, $td='outTD') {
outTR();
outTH($h);
for ($l=0; $l <=3; $l++)
for ($r=0; $r <=4; $r++)
$td($f($l, $r));
}