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