From 572cd70d9fc7baf4d86a633a3ab74c6d058a4de8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 19 Mar 2023 04:02:56 +0900 Subject: fix(content): fix XML notations --- .../write-fizzbuzz-in-php-2-letters-per-line.xml | 127 +++++++++------------ 1 file changed, 57 insertions(+), 70 deletions(-) (limited to 'content/posts/2022-09-29') diff --git a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml index d828554..59ca8be 100644 --- a/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml +++ b/content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml @@ -22,8 +22,8 @@
記事の構成について - この記事は、普通の fizzbuzz - を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 + この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。 + 最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、 このページ にソースコードがあるので、そちらを先に見てほしい。 @@ -38,8 +38,7 @@ 1行あたりの文字数は2文字までに収めること (ただし <?php タグは除く) - 厳密な定義: <?php タグ以降のソースコードが、2 byte ごとに - ラインフィード (LF) で区切られること + 厳密な定義: <?php タグ以降のソースコードが、2 byte ごとにラインフィード (LF) で区切られること @@ -55,11 +54,10 @@ 標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと) - 備考: PHP には short_open_tag - というオプションがあり、これを有効にするとファイル冒頭の <?php - の代わりに <? - を使うことができ、文字どおり1行2文字で書ける。ただ、このオプションはデフォルト - off になっている環境が多いようなので、今回は使わないことにした。 + 備考: PHP には short_open_tag というオプションがあり、 + これを有効にするとファイル冒頭の <?php の代わりに <? + を使うことができ、文字どおり1行2文字で書ける。 + ただ、このオプションはデフォルト off になっている環境が多いようなので、今回は使わないことにした。
@@ -152,15 +150,14 @@ バックスラッシュを使った行継続がトークンを区切らない、というのがポイントだ。 - さて、PHP - ではそもそもバックスラッシュを行継続に使うことができない。これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。例えば、echo - で出力することや、for でループすること、new - でインスタンスを生成することができない。特に、出力は fizzbuzz - をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。 + さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。 + これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。 + 例えば、echo で出力することや、for でループすること、 + new でインスタンスを生成することができない。 + 特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。 - 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP - の範囲内において、名前が 2文字以下の関数は以下のとおりである: + 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP の範囲内において、名前が 2文字以下の関数は以下のとおりである: @@ -177,8 +174,7 @@ (環境によって多少は変わるかも) - 2文字の関数を定義しまくった拡張モジュールを用意しておいて dl() - で読み込む行為は、レギュレーションで定めた + 2文字の関数を定義しまくった拡張モジュールを用意しておいて dl() で読み込む行為は、レギュレーションで定めた
@@ -186,13 +182,11 @@
- に反する - (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。 + に反する (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。 - また、2文字だと文字列がまともに書けないのも辛い。'' だけで - 2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP - では文字列リテラル中に生の改行が書けるので + また、2文字だと文字列がまともに書けないのも辛い。'' だけで2文字使うので、 + 「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので - 素直に書いた fizzbuzz - とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。 + 素直に書いた fizzbuzz とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。
<literal>for</literal> の排除 - for - は、3文字もある長いキーワードである。こんなものは使えない。array_ - 系の関数を使って、適当に置き換えるとしよう。 + for は、3文字もある長いキーワードである。 + こんなものは使えない。array_ 系の関数を使って、適当に置き換えるとしよう。 - array_walkrangeprintf といった for - よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、echo - は文 (statement) であり式 (expression) ではないので、式である printf - に置き換えた。 + array_walkrangeprintf といった + for よりも長いトークンが現れてしまったが、これは次節で直すことにする。 + なお、echo は文 (statement) であり式 (expression) ではないので、式である printf に置き換えた。
関数呼び出しの短縮 - rangearray_walkprintf - は長すぎるのでどうにかせねばならない。ここで、PHP - の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 + rangearray_walkprintf は長すぎるのでどうにかせねばならない。 + ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。 - これで関数を呼び出している所は短くなった。では、$r$w や - $p、また 'Fizz''Buzz' はどうやって - 1行2文字に収めるのか。次のテクニックへ移ろう。 + これで関数を呼び出している所は短くなった。 + では、$r$w$p、 + また 'Fizz''Buzz' はどうやって 1 行 2 文字に収めるのか。 + 次のテクニックへ移ろう。
@@ -296,9 +287,8 @@ - というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という - PHP 7.x までの仕様が利用できる。例えば、 Fizz - という文字列が欲しければ、次のようにする。 + というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。 + 例えば、 Fizz という文字列が欲しければ、次のようにする。 - こうして簡単に文字列を作れる。なお、この仕様は 7.x - 時点でも警告を受けるので、@ 演算子を使って抑制してやるとよい。 + こうして簡単に文字列を作れる。 + なお、この仕様は 7.x 時点でも警告を受けるので、@ 演算子を使って抑制してやるとよい。 - むしろ、このことがわかっていたからこそ PHP 8.x - での動作を要件に課したところがある。 + むしろ、このことがわかっていたからこそ PHP 8.x での動作を要件に課したところがある。
@@ -338,9 +327,9 @@ 実際に使った手法の説明に移る。 - ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算 - (&|^) - をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 + ずばり、文字列同士のビット演算を使う。 + PHP では、文字列同士でビット演算 (&|^) をした場合、 + 文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。 - 実行すると、range が表示される。さて、PHP - では文字列リテラル中に生の改行を直接書いてもよいのだった - (「主な障害」の節を参照のこと)。書きかえてみよう。 + 実行すると、range が表示される。 + さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。 + 書きかえてみよう。 - 1行あたり2文字で、range - という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。 + 1行あたり2文字で、range という文字列を生成することに成功した。 + 他の必要な文字列にも、同様の処理をほどこす。 - 備考: Buzz 中にある小文字の u は、このロジックだと non-printable - な文字になってしまう。ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。 + 備考: Buzz 中にある小文字の u は、このロジックだと non-printable な文字になってしまう。 + ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
@@ -586,9 +575,8 @@
感想など - PHP は、スクリプト言語の中だとシンタックスシュガーが少ない - (体感)。この挑戦は不可能に思われたが、PHP - マニュアルとにらめっこしていたらなんとかなった。 + PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。 + この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。 みんなもプログラムを細長くしよう。 @@ -597,11 +585,10 @@
余談2: 別解 - PHP では、バッククォートを使ってシェルを呼び出せる。これは shell_exec - 関数と等価である。さて、PHP - ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える - (当然だが、呼び出されるシェルに依存する。Bash - なら大丈夫だろう。知らんけど)。 + PHP では、バッククォートを使ってシェルを呼び出せる。 + これは shell_exec 関数と等価である。 + さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える + (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。 - なお、ここでは簡単のため出力に printf をそのまま使っているが、実際には - printf という文字列を合成して可変関数で呼び出す。 + なお、ここでは簡単のため出力に printf をそのまま使っているが、 + 実際には printf という文字列を合成して可変関数で呼び出す。 ただし、これでは @@ -681,8 +668,8 @@ ]]> - は変数で、中にはスペースとエスケープが入っている - (chr(32) . chr(92))。シェルに渡されている文字列は次のようになる。 + は変数で、中にはスペースとエスケープが入っている (chr(32) . chr(92))。 + シェルに渡されている文字列は次のようになる。 - これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz - のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう - (試してないけど)。 + これは、前掲したコマンドと同じだ。 + かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。 + Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。 ということでこれは別解ということにしておく。 -- cgit v1.2.3-70-g09d2