tag:crieit.net,2005:https://crieit.net/tags/Raku/feed 「Raku」の記事 - Crieit Crieitでタグ「Raku」に投稿された最近の記事 2024-01-06T02:34:32+09:00 https://crieit.net/tags/Raku/feed tag:crieit.net,2005:PublicArticle/18696 2024-01-06T02:33:27+09:00 2024-01-06T02:34:32+09:00 https://crieit.net/posts/raku-cp932-stdout RakuでWindowsのターミナルに文字列を出力する方法 <h1 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h1> <p>Raku(旧Perl6)はWindowsでも使えるが、日本語Windowsのターミナルは普通文字コードがUTF-8ではなくCP932(Shift_JISの拡張)である。ソースコードをUTF-8で書いた場合、普通に<code>say</code>などをすると日本語などの非ASCII文字の出力は文字化けしてしまう。</p> <p>本稿はその回避策のメモである。</p> <h1 id="前提"><a href="#%E5%89%8D%E6%8F%90">前提</a></h1> <ul> <li>バージョンは Rakudo v2023.12</li> <li>ソースコードはUTF-8で書く。</li> </ul> <h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1> <pre><code class="perl">$*OUT.encoding: 'windows-932'; my $name = "灯花"; say "こんにちは $name さん"; </code></pre> <p><code>$*OUT</code> が標準出力なので、<code>$*OUT.encoding: 'windows-932';</code>として標準出力の文字コードをCP932に変更すればよい。</p> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/routine/encoding">encoding | Raku Documentation</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/language/variables">Variables | Raku Documentation</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/B73W56H84/items/18053bf37de8bb2bb808">Perl6 特殊変数チートシート - Dynamic variables #Perl6 - Qiita</a></li> </ul> すずしめ tag:crieit.net,2005:PublicArticle/17362 2021-06-04T22:22:22+09:00 2021-06-04T22:30:00+09:00 https://crieit.net/posts/raku-grammar RakuのGrammarで四則演算を構文解析してみる <p>(自ブログの記事の転載です)</p> <h2 id="概要"><a href="#%E6%A6%82%E8%A6%81">概要</a></h2> <p>PerlやRubyのような言語には正規表現が言語機能として組み込まれています。正規表現はいろいろなところで活躍していますが、読みにくくなってしまいがちであったり、再起のある構文は解析できなかったりなどの弱点がありました。</p> <p>Raku(旧称Perl6)には、その点への対処として、Perl5とは異なる正規表現記法が導入されたほか、Grammarというさらに強力な構文解析機能が組み込まれています。これは、Parsing Expression Grammar (PEG)と呼ばれる文法に従う言語を解析できるものらしい<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>です。<a target="_blank" rel="nofollow noopener" href="https://raku.org/">Raku公式サイトのトップページ</a>のプログラム例で真っ先に挙げられているなど、Rakuの目玉機能の一つと思われるこのGrammarですが、日本語の解説を見ないので、公式チュートリアルを元に試しに使ってみた記事を書きます。</p> <h3 id="Rakuのインストール"><a href="#Raku%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Rakuのインストール</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://raku.guide/ja/#_raku%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">1.3 Rakuのインストール - Raku 入門</a>を参考にインストールしてください。</p> <h3 id="参考文献"><a href="#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE">参考文献</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/language/grammar_tutorial">Grammar tutorial</a>: 今回の元ネタたるGrammarのチュートリアル。</li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/language/grammars#sym">Grammars</a>: チュートリアルではない包括的なGrammarの解説。</li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/language/regexes">Regexes</a>: Rakuの正規表現の解説。Grammarのルールの記述には正規表現を用いるので、チュートリアルの例文によくわからないものが出てきたら適宜参照するとよさそうです。</li> <li><a target="_blank" rel="nofollow noopener" href="https://ja.wikipedia.org/wiki/Parsing_Expression_Grammar">Parsing Expression Grammar - Wikipedia</a></li> </ul> <h2 id="構文解析"><a href="#%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90">構文解析</a></h2> <h3 id="コード例"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E4%BE%8B">コード例</a></h3> <p>短いので、いきなり完成形を示してしまいましょう。<code>shisoku.raku</code>を次のように書きます。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m; </code></pre> <p>これを実行すると次のように表示されます。</p> <pre><code class="sh">$ raku shisoku.raku 「6*82 /4 + 43 -2*4」 多項式 => 「6*82 /4 + 43 -2*4」 単項式 => 「6*82 /4 」 数 => 「6」 乗算 => 「*」 単項式 => 「82 /4 」 数 => 「82 」 乗算 => 「/」 単項式 => 「4 」 数 => 「4 」 加算 => 「+」 多項式 => 「 43 -2*4」 単項式 => 「 43 」 数 => 「 43 」 加算 => 「-」 多項式 => 「2*4」 単項式 => 「2*4」 数 => 「2」 乗算 => 「*」 単項式 => 「4」 数 => 「4」 </code></pre> <p>いい感じに構文木ができていますね。日本語の鉤括弧が出てきていて、初めてみる方はなんだこれと思うかもしれませんが、Rakuは非ASCIIな記号をどんどん使っていくノリなので慣れてください。</p> <p>なお、この構文木の各要素は</p> <pre><code class="perl"># オブジェクトのメンバとして読める say $m.<多項式>.<単項式>.<単項式>.<数> # 「82 」 # .はなくてもいい say $m<多項式><単項式><単項式><数> # 「82 」 </code></pre> <p>のように、根から辿ることで参照することができます。</p> <h3 id="解説"><a href="#%E8%A7%A3%E8%AA%AC">解説</a></h3> <h4 id="文法の定義"><a href="#%E6%96%87%E6%B3%95%E3%81%AE%E5%AE%9A%E7%BE%A9">文法の定義</a></h4> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m; </code></pre> <p><code>class</code>を使ってクラスを定義するように、<code>grammar</code>を使って文法を定義します。ここで<code>四則</code>という名前で定義しています。今回は日本語にしましたが、これは四則演算を英語で何と言うかが出てこなかったからです。別に英語(や他の言語)でも構いません。</p> <p>定義した文法に対して<code>parse</code>を呼ぶと、構文解析結果を返してくれます(この時の返り値<code>$m</code>をマッチオブジェクトといいます)。このマッチオブジェクトを<code>say</code>すると、先ほど示したようにいいかんじに表示してくれます。</p> <p>なお、もう少し厳密にオブジェクトの構造を見たい場合は</p> <pre><code class="perl">say $m.raku; </code></pre> <p>とします。<code>raku</code>メソッドは、全てのオブジェクトに生えている<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">2</a></sup>、そのオブジェクトのRaku的な表現を返す函数です。</p> <h4 id="トークンの定義(前半)"><a href="#%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%AE%9A%E7%BE%A9%EF%BC%88%E5%89%8D%E5%8D%8A%EF%BC%89">トークンの定義(前半)</a></h4> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m; </code></pre> <p>grammarの中には、文法の内容を<code>token</code>を用いて書いていきます。</p> <p>まず、「全体は〜である」という主張を<code>TOP</code>に書きます。今回の場合、全体は多項式です。多項式は別に定義することにして、とりあえず<code><多項式></code>とだけ書いています。このように<code><></code>で囲むことで、別に定義したトークンを参照することができます。</p> <p>次は、多項式。「多項式は単項式である」または「多項式は単項式と加算記号と多項式を順に並べたものである」という定義を素直に書いています。ここで若干注意すべきは、複雑なものを後に書いていることです。PEGはルールを前から順にあてはめていくので、両方当てはまりうる場合は注意する必要があります。まあ、なんとなくマッチしにくそうなものを前に持っていけばいいのではないでしょうか。<strong>なお、Rakuで正規表現を書くときの式では、空白が無視されます。</strong><code>{ <単項式> <加算> <多項式> | <単項式> }</code>と書いても、<code>{<単項式><加算><多項式>|<単項式>}</code>と書いても同じです。</p> <p>3つめは「加算」ですが、これは見ての通りです。こう書かずに</p> <pre><code class="perl"> token 多項式 { <単項式> [<和> | <差>] <多項式> | <単項式> } token 和 { '+' } token 差 { '-' } </code></pre> <p>のようにしてもよかったのですが、そうはしませんでした。これは、この後で行う演算がこの形式では不便そうだったからです。</p> <h4 id="トークンの定義(後半)"><a href="#%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%AE%9A%E7%BE%A9%EF%BC%88%E5%BE%8C%E5%8D%8A%EF%BC%89">トークンの定義(後半)</a></h4> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m; </code></pre> <p>単項式と乗算に関しては多項式のところと同じです。</p> <p>少し説明の必要があるのが数の定義(整数の定義)のところです。<code>\d+</code>は正規表現で「1文字以上の連続した数字」なのですが、これだけだと数式にスペースを入れたときに認識されなくなってしまいます。そこで、スペースを入れても良いようにするために、「0文字以上の空白」を表す組み込みルールである<code><.ws></code>を前後に入れました。「0文字以上の空白」は<code><ws></code>でもいいのですが、このように前に<code>.</code>を入れ<code><.ws></code>とすることで、キャプチャされない(構文木に現れない)ようにすることができます(この挙動は<code>ws</code>以外でも同じです)。</p> <p>なお、<code><.ws></code>は「0文字以上の空白」であると書きましたが、実は置かれた場所が普通の文字の間である場合(スペースがないと単語区切りがわからない場合)は、「1文字以上の空白」を表します。例えば、<code>'a'<.ws>'*'</code>は<code>a*</code>にマッチしますが、<code>'a'<.ws>'b'</code>は<code>ab</code>にはマッチしません(<code>a b</code>にはマッチする)。詳しくは、<a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/language/grammars#ws">wsの解説</a>を読んでください。また、今回の記事では使いませんが、<code>token</code>の代わりに<code>rule</code>を使うと、正規表現の表記中の空白を自動で<code><.ws></code>に置き換えてくれます。</p> <h2 id="計算の実行"><a href="#%E8%A8%88%E7%AE%97%E3%81%AE%E5%AE%9F%E8%A1%8C">計算の実行</a></h2> <h3 id="action object"><a href="#action+object">action object</a></h3> <p>さて、以上で構文木をつくることができました。この木を何らかの函数で読み込んで処理してやれば計算ができるはずですが、それはたくさんの場合分けが必要になって少し面倒かもしれません。そこで、構文解析時に処理を行って値を返す機能(action object)を使ってみましょう。</p> <p>まずは、何もせずに適当な値を返す例からです。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } class 四則計算処理 { method TOP($/) { make 6 } method 多項式($/) { make 7 } } my $m = 四則.parse('4', actions => 四則計算処理.new); say $m.made[0]; # 6 say $m<多項式>.made[0]; # 7 </code></pre> <p>まず、<code>四則計算処理</code>というクラスを作っています。ここに、値を計算して返す処理を入れていきます。この例では<code>TOP</code>と<code>多項式</code>という名前でメソッドを定義していますが、これはそれぞれ同名のトークンが見つかった時に為される処理になります。返す値は、<code>return</code>ではなく<code>make</code>という特別な函数を使って返します。</p> <p>このクラスのインスタンスを作って<code>parse</code>函数の<code>actions</code>引数に渡してやると、この処理を実行してくれます。得た返り値は、<code>made</code>という配列に入ります。今回はただ整数の6と7を返しているだけなので、それがただ入っています。</p> <h3 id="数を返す"><a href="#%E6%95%B0%E3%82%92%E8%BF%94%E3%81%99">数を返す</a></h3> <p>今度は、マッチした値を使ってみます。まずは簡単な<code>数</code>からいきましょう。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } class 四則計算処理 { method 数($/) { make $/.Int } } my $m = 四則.parse('4', actions => 四則計算処理.new); say $m<多項式><単項式><数>.made[0]; # 4 </code></pre> <p>こうすると、マッチしたのと同じ<code>4</code>が返ってきます。<code>$/</code>でマッチオブジェクトが受け取れるので、それを<code>Int</code>で整数にして返しているわけです。整数以外で返したい場合は、<a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/type/Match">class Match</a>で適当な函数を探してみてください。</p> <h3 id="単項式を計算する"><a href="#%E5%8D%98%E9%A0%85%E5%BC%8F%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B">単項式を計算する</a></h3> <p>次は、<code>単項式</code>です。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } class 四則計算処理 { method 単項式($/) { given $/<乗算> { when Nil { # ただの数の場合 make $/<数>.made[0] } when '*' { # 掛け算の場合 make $/<数>.made[0] * $/<単項式>.made[0] } when '/' { # 割り算の場合 make $/<数>.made[0] / $/<単項式>.made[0] } } } method 数($/) { make $/.Int } } my $m = 四則.parse('5*6/7', actions => 四則計算処理.new); say $m<多項式><単項式>.made[0]; # 4.285714 say $m<多項式><単項式>.made[0].raku; # <30/7> </code></pre> <p>今度は場合分けが生じるので、少し複雑になっています。<code>given</code>は他の言語でいうswitchですから、<code>$/<乗算></code>の値を見て「ただの数の場合」「掛け算の場合」「割り算の場合」に分けています。あとは、子要素の返した値を<code>made</code>で受け取って、計算して返しているだけです。</p> <p>なお、ここで整数の割り算<code>/</code>をしていますが、Rakuの割り算<code>/</code>は、切り捨てるでも浮動小数点数を返すでもなく有理数を返すという変態仕様です。例でも、<code>4.285714</code>と表示されるものが内部では<code>30/7</code>で持たれていることがわかります。</p> <h3 id="多項式を計算する(完成)"><a href="#%E5%A4%9A%E9%A0%85%E5%BC%8F%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%EF%BC%88%E5%AE%8C%E6%88%90%EF%BC%89">多項式を計算する(完成)</a></h3> <p>同様にして多項式も実装すれば、完成です。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> } token 多項式 { <単項式> <加算> <多項式> | <単項式> } token 加算 { '+' | '-' } token 単項式 { <数> <乗算> <単項式> | <数> } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws>} } class 四則計算処理 { method TOP($/) { make $/<多項式>.made[0] } method 多項式($/) { given $/<加算> { when Nil { make $/<単項式>.made[0] } when '+' { make $/<単項式>.made[0] + $/<多項式>.made[0] } when '-' { make $/<単項式>.made[0] - $/<多項式>.made[0] } } } method 単項式($/) { given $/<乗算> { when Nil { make $/<数>.made[0] } when '*' { make $/<数>.made[0] * $/<単項式>.made[0] } when '/' { make $/<数>.made[0] / $/<単項式>.made[0] } } } method 数($/) { make $/.Int } } my $m = 四則.parse('6*82 /4 + 43 -2*4', actions => 四則計算処理.new); say $m.made[0]; # 158 </code></pre> <p>確かに、<code>6*82 /4 + 43 -2*4</code>の計算結果である158が返ってきています。このように、<code>make</code>と<code>made</code>を使うことで構文木の親に値を渡していくことができ、自然に再起的な処理を書くことができます。</p> <p>以上の例では計算処理を別のクラスに書いて<code>actions</code>で渡していましたが、実は<code>grammar</code>の中に直接書いてしまうこともできます。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> { make $/<多項式>.made[0] } } token 多項式 { [ <単項式> <加算> <多項式> | <単項式> ] { given $/<加算> { when Nil { make $/<単項式>.made[0] } when '+' { make $/<単項式>.made[0] + $/<多項式>.made[0] } when '-' { make $/<単項式>.made[0] - $/<多項式>.made[0] } } } } token 加算 { '+' | '-' } token 単項式 { [ <数> <乗算> <単項式> | <数> ] { given $/<乗算> { when Nil { make $/<数>.made[0] } when '*' { make $/<数>.made[0] * $/<単項式>.made[0] } when '/' { make $/<数>.made[0] / $/<単項式>.made[0] } } } } token 乗算 { '*' | '/' } token 数 {<.ws> \d+ <.ws> { make $/.Int } } } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m.made[0]; # 158 </code></pre> <p>パターンの後に中括弧で囲った処理を書くとそれが実行されるというわけです。orの処理があるときはそれぞれに対して処理を書くようになっているらしく、もとの例と同様に書くならば、<code>[ <単項式> <加算> <多項式> | <単項式> ]</code>のようにパターンを括弧で括ってorが外に出ないようにする必要がありました。</p> <p>もちろん、orごとに処理が書けることを利用して次のように書くこともできます。</p> <pre><code class="perl">#!/usr/bin/env raku grammar 四則 { token TOP { <多項式> { make $/<多項式>.made[0] } } token 多項式 { <単項式> '+' <多項式> { make $/<単項式>.made[0] + $/<多項式>.made[0] } | <単項式> '-' <多項式> { make $/<単項式>.made[0] - $/<多項式>.made[0] } | <単項式> { make $/<単項式>.made[0] } } token 単項式 { <数> '*' <単項式> { make $/<数>.made[0] * $/<単項式>.made[0] } | <数> '/' <単項式> { make $/<数>.made[0] / $/<単項式>.made[0] } | <数> { make $/<数>.made[0] } } token 数 {<.ws> \d+ <.ws> { make $/.Int } } } my $m = 四則.parse('6*82 /4 + 43 -2*4'); say $m.made[0]; # 158 </code></pre> <p><code>加算</code>と<code>乗算</code>のトークンが不要になってすっきりしましたね。使い方などで、アクションオブジェクトを使うか否か適宜決めるとよさそうです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>以上、RakuのGrammar機能で四則演算を構文解析し、計算を行う方法についてみてきました。「再帰的な正規表現」くらいの気持ちで気軽に使えるものだ、というのが印象です。PEGパーサーライブラリは多くの言語にありますが、標準機能に組み込んでいるのは、文字列処理に強い言語Perlを継ごうという意志を感じられて面白いなと思います。</p> <p>問題は、今あまり構文解析したい対象がないことですね……。一時期は構文解析のことばかり調べていたのですが、その熱意が失われてしまっています。XMLやJSON、YAML、TOMLといった有名どころのパーサは誰かが公開しているので、あまり自分で書く必要が出てこないというのが大きい理由です。Visual C++を触っていた高校生の頃に比べると外部ライブラリを使う手間は100分の1くらいになっているのですが、そのぶん自分で難しいことをこなす動機がなくなって、少し寂しいかなとも思うのです。</p> <h2 id="次に読むとよさそうな資料"><a href="#%E6%AC%A1%E3%81%AB%E8%AA%AD%E3%82%80%E3%81%A8%E3%82%88%E3%81%95%E3%81%9D%E3%81%86%E3%81%AA%E8%B3%87%E6%96%99">次に読むとよさそうな資料</a></h2> <p><a href="#参考文献">参考文献</a>に挙げたもののほかに、次のようなものが参考になりそうです。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://examples.perl6.org/categories/interpreters/calc.html">Simple Infix Arithmetic Calculator</a>: もう少ししっかり書かれた四則演算計算機のコードです。例外処理がされています。 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://examples.perl6.org/categories/interpreters.html">Language or DSL interpreters</a>には他にも逆ポーランド記法計算機、brainfuckインタプリタ、Lispインタプリタの例があります。</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/moritz/json">moritz/json: A tiny JSON parser and emitter for Perl 6 on Rakudo</a>: 簡潔に書かれたJSONパーサです。</li> </ul> <div class="footnotes" role="doc-endnotes"> <hr /> <ol> <li id="fn:1" role="doc-endnote"> <p>「らしい」と書いたのは、現在のRakuのドキュメントにはこのGrammarがPEGを解析できるといったことが記されている部分が見当たらないからです。Perl6の開発段階のドキュメントにはPEGを実装する旨が書かれているようです(<a target="_blank" rel="nofollow noopener" href="https://en.wikipedia.org/wiki/Raku_rules">Raku rules - Wikipedia</a>の出典を参照)。まあ、機能を見たらPEGが解析できるか否かわかる人にはわかるのでしょうが……。 <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> <li id="fn:3" role="doc-endnote"> <p>Rakuでは全てのクラスが<a target="_blank" rel="nofollow noopener" href="https://docs.raku.org/type/Mu"><code>Mu</code>(無)クラス</a>を継承しています。<code>raku</code>メソッドは<code>Mu</code>クラスで定義されています。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p> </li> </ol> </div> すずしめ