Page 1
PHP式プログラミング入門
Guide to expression-oriented programming in PHP
USAMI Kenta
2022.01.21
公開日:
by USAMI Kenta@tadsan
にオンラインのZoom会議で開催された『第二回関数型プログラミング(仮)の会』でライトニングトーク(5分)として発表しました。
2022.01.21
お前誰よ
(*出典: 『初めての人のためのLISP』)
普段はEmacsというLisp専用OSでPHP開発する環境を作ってます
こういうバックグラウンドなので関数型よくわからない…
map/reduceが関数プログラミングなんでしょ
僕はあらゆるループをLispのLOOPマクロで書きたい派なんで…
ちなみにLispはElixirと同様に、基本的にreturnを書けません
PHPってどういう言語
<!DOCTYPE html public>
<p>現在は<?= date('%H時%i分%s秒です') ?></p>
<?php echo "<!DOCTYPE html public>\n\n";echo "<p>現在は", date('%H時%i分%s秒です'), "</p>\n";
こういうノリでWebアプリがサクっと書ける素朴な言語
PHPはこんな言語
function ($a, $b) use ($c) { return $a + $b + $c; }
function ($a, $b) use ($c) { return $a + $b + $c; }
これだけ知ればおもしろいこといろいろできそう
世の中にはいろんな制約を課したプログラミングがある
セミコロンなしでJavaを書くとか
Pythonワンライナーとか
$なしでPHPを書くとか
これはこれでおもしろい
(再掲)PHPはこんな言語
こいつら目障りじゃないですか?
セミコロンレス
Javaでは
; だけじゃなくて{} も縛りたくない?
<!DOCTYPE html public>
<p>現在は<?= date('%H時%i分%s秒です') ?></p>
?> 直前は; を削れる
すべての処理を<?= に押し込む
できれば一個の<?= に押し込む
PHPは式指向プログラミングできる下地はいろいろある
これだけできればチューリング完全であることは自明
1から100を改行区切りで出力
<?= implode(range(1, 100), "\n") ?>
1から100をFizzBuzzに変換して改行区切りで出力
<?= implode(array_map(fn(int $n): string => [[$n, 'Buzz'],['Fizz', 'FizzBuzz']][$n%3==0][$n%5==0],range(1, 100), "\n") ?>
こういうノリでmap/reduceに変形できれば任意の処理が可能
パイプライン演算子が欲しくなってくるぜ(Lispならスレッドマクロがあるのに)
そう思ったことが私にもありました
https://qiita.com/perpouh/items/807775de16986a956d1c より引用
文を多用してるのでfn() に置き換え困難
array_map/array_reduceはあくまで配列処理
変数を参照としてキャプチャしないと
<?php
いけない
$fib = function (int $n) use (&$fib) {return ($n < 2)? 1: $fib($n - 1) + $fib($n -2);};
クロージャ作成時にはクロージャ自体は作られてない
<?php
ので束縛できない
$fib = fn (int $n) =>($n < 2)? 1: $fib($n - 1) + $fib($n -2);
いわゆるYコンビネータ(Zコンビネータ)
PHPはLispじゃない式指向プログラミングは大変
エクストリームスポーツを楽しもう
ご静聴ありがとうございました
あとPHPでもかなり実用的な静的型検査ができるようになってる
関連記事
