Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

PHPですべてをFにしたかった

すべてをFにしたかった結果

<?php

require "F";

F('FFffFfF FFfffFF FFfFfff FFfFFFF Ffffff FfffFf FfFfFff FFfFfff FFffFfF Ffffff FfFffff FFffFfF FFFffFf FFffFFf FFffFfF FFfffFF FFFfFff Ffffff FffFffF FFfFFFf FFFffFF FFfFffF FFffFff FFffFfF FFFffFf FfFFFf FfFFFff FFfFFFf FfffFf FFFfFF FfFf');
The Perfect Insider.

最初の <?php と require を消す方法は何かないだろうか…。
あと小文字のfを使うのも妥協した。

やったこと

F = 1, f = 0 に見立てて、2進数 -> 10進数 -> 文字化して、最後にeval()しただけ。

F
<?php

function F($str) {
    $str = str_replace('f', '0', $str);
    $str = str_replace('F', '1', $str);

    $ret = "";
    foreach (explode(' ', $str) as $s) {
        $ret .= chr(bindec($s));
    }

    eval($ret);
}

F()に渡す文字列を作るのは、その逆をすればよい。

<?php

$filepath = $argv[1];

$ret = [];

foreach (file($filepath) as $line) {
    foreach (str_split($line) as $c) {
        $ret[] = decbin(ord($c));
    }
}
$ret = implode(' ', $ret);

$ret = str_replace('0', 'f', $ret);
$ret = str_replace('1', 'F', $ret);

echo $ret;

PHPで関数を返す関数を呼んで関数を呼びたかった(即時実行)

関数を返す関数を変数に入れて、直接呼びたい。

<?php

$f = function ($x) {
    return function ($y) use ($x) {
        return $x + $y;
    };
};

echo $f(123)(234); //=> 357

PHP7

問題なし。

PHP5.6

syntax error, unexpected '('

怒られた。

他の動かない例

括弧したり変数に入れたり。

<?php

echo ($f(123))(234); // syntax error, unexpected '('

echo ($f2 = $f(123))(234); // syntax error, unexpected '('
動いた例

変数に一旦入れた後、改めて呼べばいいんだけど、なんだか悔しい。

<?php

$f2 = $f(123);
echo $f2(234);

先輩PHPerからの教えによれば__invoke()を使えばいいとのこと。

<?php

echo $f(123)->__invoke(234);

なるほど。(よくわからないけど動いた感)

見た目があれだけど、call_user_func()でも動くらしい。

<?php

echo call_user_func($f(123), 234);