aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts/2022-09-29
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2023-03-19 04:02:56 +0900
committernsfisis <nsfisis@gmail.com>2023-03-19 04:02:56 +0900
commit572cd70d9fc7baf4d86a633a3ab74c6d058a4de8 (patch)
tree01add3cfd42c164f78931eba0ca9e6b82423a9e7 /content/posts/2022-09-29
parentdb3d51ddc421dad68abddb95d01ffdab440197d6 (diff)
downloadblog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.tar.gz
blog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.tar.zst
blog.nsfisis.dev-572cd70d9fc7baf4d86a633a3ab74c6d058a4de8.zip
fix(content): fix XML notations
Diffstat (limited to 'content/posts/2022-09-29')
-rw-r--r--content/posts/2022-09-29/write-fizzbuzz-in-php-2-letters-per-line.xml127
1 files changed, 57 insertions, 70 deletions
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 @@
<section xml:id="intro">
<title>記事の構成について</title>
<simpara>
- この記事は、普通の fizzbuzz
- を徐々に変形して最終形にしていく、という構成で書かれている。最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、
+ この記事は、普通の fizzbuzz を徐々に変形して最終形にしていく、という構成で書かれている。
+ 最終形を見てどのような仕組みで動いているのか解読してから解説を読みたい、というかたがいれば、
<link xl:href="https://gist.github.com/nsfisis/04c227d5a419867472a0b23a83ad2919#file-fizzbuzz-php-2-letters-per-line-and-supports-php-8-x-without-warnings">このページ</link>
にソースコードがあるので、そちらを先に見てほしい。
</simpara>
@@ -38,8 +38,7 @@
1行あたりの文字数は2文字までに収めること (ただし <literal>&lt;?php</literal> タグは除く)
<itemizedlist>
<listitem>
- 厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとに
- ラインフィード (LF) で区切られること
+ 厳密な定義: <literal>&lt;?php</literal> タグ以降のソースコードが、2 byte ごとにラインフィード (LF) で区切られること
</listitem>
</itemizedlist>
</listitem>
@@ -55,11 +54,10 @@
<listitem>標準的なインストール構成の PHP で実現できること (デフォルトで有効になっていない拡張等を使わないこと)</listitem>
</itemizedlist>
<simpara>
- 備考: PHP には <literal>short_open_tag</literal>
- というオプションがあり、これを有効にするとファイル冒頭の <literal>&lt;?php</literal>
- の代わりに <literal>&lt;?</literal>
- を使うことができ、文字どおり1行2文字で書ける。ただ、このオプションはデフォルト
- off になっている環境が多いようなので、今回は使わないことにした。
+ 備考: PHP には <literal>short_open_tag</literal> というオプションがあり、
+ これを有効にするとファイル冒頭の <literal>&lt;?php</literal> の代わりに <literal>&lt;?</literal>
+ を使うことができ、文字どおり1行2文字で書ける。
+ ただ、このオプションはデフォルト off になっている環境が多いようなので、今回は使わないことにした。
</simpara>
</section>
<section xml:id="problems">
@@ -152,15 +150,14 @@
バックスラッシュを使った行継続がトークンを区切らない、というのがポイントだ。
</simpara>
<simpara>
- さて、PHP
- ではそもそもバックスラッシュを行継続に使うことができない。これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。例えば、<literal>echo</literal>
- で出力することや、<literal>for</literal> でループすること、<literal>new</literal>
- でインスタンスを生成することができない。特に、出力は fizzbuzz
- をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
+ さて、PHP ではそもそもバックスラッシュを行継続に使うことができない。
+ これにより、「3文字以上からなるトークンが一切使えない」という制約が課される。
+ 例えば、<literal>echo</literal> で出力することや、<literal>for</literal> でループすること、
+ <literal>new</literal> でインスタンスを生成することができない。
+ 特に、出力は fizzbuzz をどんなアルゴリズムで実装しようとおこなわなければならないので、できないのは致命的である。
</simpara>
<simpara>
- 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP
- の範囲内において、名前が 2文字以下の関数は以下のとおりである:
+ 当然、名前が3文字以上ある関数も使えない。なお、標準 PHP の範囲内において、名前が 2文字以下の関数は以下のとおりである:
</simpara>
<itemizedlist>
<listitem>
@@ -177,8 +174,7 @@
(環境によって多少は変わるかも)
</simpara>
<simpara>
- 2文字の関数を定義しまくった拡張モジュールを用意しておいて <literal>dl()</literal>
- で読み込む行為は、レギュレーションで定めた
+ 2文字の関数を定義しまくった拡張モジュールを用意しておいて <literal>dl()</literal> で読み込む行為は、レギュレーションで定めた
</simpara>
<blockquote>
<itemizedlist>
@@ -186,13 +182,11 @@
</itemizedlist>
</blockquote>
<simpara>
- に反する
- (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。
+ に反する (というより、「それだとおもしろくもなんともないので、このルールを足した」というのが正しい)。
</simpara>
<simpara>
- また、2文字だと文字列がまともに書けないのも辛い。<literal>''</literal> だけで
- 2文字使うので、「1文字の文字列リテラル」というものを書くことができない。PHP
- では文字列リテラル中に生の改行が書けるので
+ また、2文字だと文字列がまともに書けないのも辛い。<literal>''</literal> だけで2文字使うので、
+ 「1文字の文字列リテラル」というものを書くことができない。PHP では文字列リテラル中に生の改行が書けるので
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -226,16 +220,14 @@
]]>
</programlisting>
<simpara>
- 素直に書いた fizzbuzz
- とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。
+ 素直に書いた fizzbuzz とは言い難いが、このくらいは普通だということにしておかないと、この先がやっていられないので許してほしい。
</simpara>
</section>
<section xml:id="commentary--remove-keywords">
<title><literal>for</literal> の排除</title>
<simpara>
- <literal>for</literal>
- は、3文字もある長いキーワードである。こんなものは使えない。<literal>array_</literal>
- 系の関数を使って、適当に置き換えるとしよう。
+ <literal>for</literal> は、3文字もある長いキーワードである。
+ こんなものは使えない。<literal>array_</literal> 系の関数を使って、適当に置き換えるとしよう。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -250,18 +242,16 @@
]]>
</programlisting>
<simpara>
- <literal>array_walk</literal> や <literal>range</literal>、<literal>printf</literal> といった <literal>for</literal>
- よりも長いトークンが現れてしまったが、これは次節で直すことにする。なお、<literal>echo</literal>
- は文 (statement) であり式 (expression) ではないので、式である <literal>printf</literal>
- に置き換えた。
+ <literal>array_walk</literal> や <literal>range</literal>、<literal>printf</literal> といった
+ <literal>for</literal> よりも長いトークンが現れてしまったが、これは次節で直すことにする。
+ なお、<literal>echo</literal> は文 (statement) であり式 (expression) ではないので、式である <literal>printf</literal> に置き換えた。
</simpara>
</section>
<section xml:id="commentary--shorten-function-invocation">
<title>関数呼び出しの短縮</title>
<simpara>
- <literal>range</literal>、<literal>array_walk</literal>、<literal>printf</literal>
- は長すぎるのでどうにかせねばならない。ここで、PHP
- の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
+ <literal>range</literal>、<literal>array_walk</literal>、<literal>printf</literal> は長すぎるのでどうにかせねばならない。
+ ここで、PHP の可変関数を使う。可変関数とは、関数名が文字列として入った変数を経由して、関数を呼び出す機能である。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -280,9 +270,10 @@
]]>
</programlisting>
<simpara>
- これで関数を呼び出している所は短くなった。では、<literal>$r</literal> や <literal>$w</literal> や
- <literal>$p</literal>、また <literal>'Fizz'</literal> や <literal>'Buzz'</literal> はどうやって
- 1行2文字に収めるのか。次のテクニックへ移ろう。
+ これで関数を呼び出している所は短くなった。
+ では、<literal>$r</literal> や <literal>$w</literal> や <literal>$p</literal>、
+ また <literal>'Fizz'</literal> や <literal>'Buzz'</literal> はどうやって 1 行 2 文字に収めるのか。
+ 次のテクニックへ移ろう。
</simpara>
</section>
<section xml:id="commentary--incompatible-solution">
@@ -296,9 +287,8 @@
</itemizedlist>
</blockquote>
<simpara>
- というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という
- PHP 7.x までの仕様が利用できる。例えば、 <literal>Fizz</literal>
- という文字列が欲しければ、次のようにする。
+ というルールがない場合、「未定義の定数が評価された場合、その定数の名前が値になる」という PHP 7.x までの仕様が利用できる。
+ 例えば、 <literal>Fizz</literal> という文字列が欲しければ、次のようにする。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -311,8 +301,8 @@
]]>
</programlisting>
<simpara>
- こうして簡単に文字列を作れる。なお、この仕様は 7.x
- 時点でも警告を受けるので、<literal>@</literal> 演算子を使って抑制してやるとよい。
+ こうして簡単に文字列を作れる。
+ なお、この仕様は 7.x 時点でも警告を受けるので、<literal>@</literal> 演算子を使って抑制してやるとよい。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -328,8 +318,7 @@
]]>
</programlisting>
<simpara>
- むしろ、このことがわかっていたからこそ PHP 8.x
- での動作を要件に課したところがある。
+ むしろ、このことがわかっていたからこそ PHP 8.x での動作を要件に課したところがある。
</simpara>
</section>
<section xml:id="commentary--shorten-string-literals">
@@ -338,9 +327,9 @@
実際に使った手法の説明に移る。
</simpara>
<simpara>
- ずばり、文字列同士のビット演算を使う。PHP では、文字列同士でビット演算
- (<literal>&amp;</literal>、<literal>|</literal>、<literal>^</literal>)
- をした場合、文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
+ ずばり、文字列同士のビット演算を使う。
+ PHP では、文字列同士でビット演算 (<literal>&amp;</literal>、<literal>|</literal>、<literal>^</literal>) をした場合、
+ 文字列の各バイトごとに指定したビット演算がなされ、それを結合したものが演算結果となる。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -369,9 +358,9 @@
]]>
</programlisting>
<simpara>
- 実行すると、<literal>range</literal> が表示される。さて、PHP
- では文字列リテラル中に生の改行を直接書いてもよいのだった
- (「主な障害」の節を参照のこと)。書きかえてみよう。
+ 実行すると、<literal>range</literal> が表示される。
+ さて、PHP では文字列リテラル中に生の改行を直接書いてもよいのだった (「主な障害」の節を参照のこと)。
+ 書きかえてみよう。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -415,12 +404,12 @@
]]>
</programlisting>
<simpara>
- 1行あたり2文字で、<literal>range</literal>
- という文字列を生成することに成功した。他の必要な文字列にも、同様の処理をほどこす。
+ 1行あたり2文字で、<literal>range</literal> という文字列を生成することに成功した。
+ 他の必要な文字列にも、同様の処理をほどこす。
</simpara>
<simpara>
- 備考: <literal>Buzz</literal> 中にある小文字の <literal>u</literal> は、このロジックだと non-printable
- な文字になってしまう。ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
+ 備考: <literal>Buzz</literal> 中にある小文字の <literal>u</literal> は、このロジックだと non-printable な文字になってしまう。
+ ここまでのテクニックを駆使すれば回避するのはそう難しくないので、考えてみてほしい。
</simpara>
</section>
</section>
@@ -586,9 +575,8 @@
<section xml:id="outro">
<title>感想など</title>
<simpara>
- PHP は、スクリプト言語の中だとシンタックスシュガーが少ない
- (体感)。この挑戦は不可能に思われたが、PHP
- マニュアルとにらめっこしていたらなんとかなった。
+ PHP は、スクリプト言語の中だとシンタックスシュガーが少ない (体感)。
+ この挑戦は不可能に思われたが、PHP マニュアルとにらめっこしていたらなんとかなった。
</simpara>
<simpara>
みんなもプログラムを細長くしよう。
@@ -597,11 +585,10 @@
<section xml:id="alternative-solution">
<title>余談2: 別解</title>
<simpara>
- PHP では、バッククォートを使ってシェルを呼び出せる。これは <literal>shell_exec</literal>
- 関数と等価である。さて、PHP
- ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える
- (当然だが、呼び出されるシェルに依存する。Bash
- なら大丈夫だろう。知らんけど)。
+ PHP では、バッククォートを使ってシェルを呼び出せる。
+ これは <literal>shell_exec</literal> 関数と等価である。
+ さて、PHP ではバックスラッシュによる行継続が使えないと書いたが、シェルでは使える
+ (当然だが、呼び出されるシェルに依存する。Bash なら大丈夫だろう。知らんけど)。
</simpara>
<programlisting language="php" linenumbering="unnumbered">
<![CDATA[
@@ -620,8 +607,8 @@
]]>
</programlisting>
<simpara>
- なお、ここでは簡単のため出力に <literal>printf</literal> をそのまま使っているが、実際には
- <literal>printf</literal> という文字列を合成して可変関数で呼び出す。
+ なお、ここでは簡単のため出力に <literal>printf</literal> をそのまま使っているが、
+ 実際には <literal>printf</literal> という文字列を合成して可変関数で呼び出す。
</simpara>
<simpara>
ただし、これでは
@@ -681,8 +668,8 @@
]]>
</literallayout>
<simpara>
- は変数で、中にはスペースとエスケープが入っている
- (<literal>chr(32) . chr(92)</literal>)。シェルに渡されている文字列は次のようになる。
+ は変数で、中にはスペースとエスケープが入っている (<literal>chr(32) . chr(92)</literal>)。
+ シェルに渡されている文字列は次のようになる。
</simpara>
<literallayout class="monospaced">
<![CDATA[
@@ -697,9 +684,9 @@
]]>
</literallayout>
<simpara>
- これは、前掲したコマンドと同じだ。かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。Fizzbuzz
- のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう
- (試してないけど)。
+ これは、前掲したコマンドと同じだ。
+ かくして、スペースを陽に書かずにシェルをおおよそ自由に扱えるようになった。
+ Fizzbuzz のワンライナーくらいすぐ書けるだろうから、あとはなんとかなるだろう (試してないけど)。
</simpara>
<simpara>
ということでこれは別解ということにしておく。