diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-08-08 10:38:18 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-08-08 10:38:18 +0900 |
| commit | 4681e861efcdf9b0b73e3803e70712bc55162863 (patch) | |
| tree | d910ef14d9549df19896d85a42e12a32db787fb6 /services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in | |
| parent | eca423774047122f7dfc4be9ac78626e32d733d3 (diff) | |
| download | nsfisis.dev-main.tar.gz nsfisis.dev-main.tar.zst nsfisis.dev-main.zip | |
Diffstat (limited to 'services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in')
| -rw-r--r-- | services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html | 204 |
1 files changed, 108 insertions, 96 deletions
diff --git a/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html index 8a13a7e2..ce5b34f0 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Ruby】 then キーワードと case in|REPL: Rest-Eat-Program Loop</title> - <link rel="stylesheet" href="/style.css?h=bf289421c09405fa3c89dc8b18742368"> + <link rel="stylesheet" href="/style.css?h=61618c116e07057fc873f7751f158cd7"> </head> <body class="single"> <header class="header"> @@ -103,36 +103,38 @@ 使われることは稀だが、Ruby では <code>then</code> がキーワードになっている。次のように使う: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">cond</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"Y"</span> -</div><div class="codeblock-line"><span style="color: #cf222e">else</span> -</div><div class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"N"</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">cond</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"Y"</span> +</span><span class="codeblock-line"><span style="color: #cf222e">else</span> +</span><span class="codeblock-line"> <span style="color: #953800">puts</span> <span style="color: #0a3069">"N"</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> このキーワードが現れうる場所はいくつかあり、<code>if</code>、<code>unless</code>、<code>rescue</code>、<code>case</code> 構文がそれに当たる。 上記のように、何か条件を書いた後 <code>then</code> を置き、式がそこで終了していることを示すマーカーとして機能する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># Example:</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">unless</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">begin</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">rescue</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -</div><div class="codeblock-line"><span style="color: #cf222e">when</span> <span style="color: #953800">p</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781"># Example:</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">unless</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">begin</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">rescue</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</span><span class="codeblock-line"><span style="color: #cf222e">when</span> <span style="color: #953800">p</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> </section> <section id="section--why-then-is-usually-unnecessary"> @@ -141,17 +143,19 @@ 普通 Ruby のコードで <code>then</code> を書くことはない。なぜか。次のコードを実行してみるとわかる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> <span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> <span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> 次のような構文エラーが出力される。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n' -</div><div class="codeblock-line">if true puts 'Hello, World!' end -</div><div class="codeblock-line"> ^~~~ -</div><div class="codeblock-line">20:1: syntax error, unexpected `end', expecting end-of-input -</div><div class="codeblock-line">...f true puts 'Hello, World!' end</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n' +</span><span class="codeblock-line">if true puts 'Hello, World!' end +</span><span class="codeblock-line"> ^~~~ +</span><span class="codeblock-line">20:1: syntax error, unexpected `end', expecting end-of-input +</span><span class="codeblock-line">...f true puts 'Hello, World!' end +</span></code></pre> </div> <p> 二つ目のメッセージは無視して一つ目を読むと、<code>then</code> か <code>;</code> か改行が来るはずのところ変数だかメソッドだかが現れたことによりエラーとなっているようだ。 @@ -160,8 +164,9 @@ ポイントは改行が <code>then</code> (や <code>;</code>) の代わりとなることである。<code>true</code> の後に改行を入れてみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> -</div><div class="codeblock-line"><span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #cf222e">true</span> +</span><span class="codeblock-line"><span style="color: #953800">puts</span> <span style="color: #0a3069">'Hello, World!'</span> <span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> 無事 Hello, World! と出力されるようになった。 @@ -173,22 +178,25 @@ なぜ <code>then</code> や <code>;</code> や改行 (以下 「<code>then</code> 等」) が必要なのだろうか。次の例を見てほしい: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> <span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> <code>then</code> も <code>;</code> も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。この例は二通りに解釈できる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価</span> -</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781"># a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価</span> +</span><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、</span> -</div><div class="codeblock-line"><span style="color: #6e7781"># その結果が truthy なら何もしない</span> -</div><div class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781"># a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、</span> +</span><span class="codeblock-line"><span style="color: #6e7781"># その結果が truthy なら何もしない</span> +</span><span class="codeblock-line"><span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">a</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">b</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">then</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> <code>then</code> 等はこの曖昧性を排除するためにあり、条件式は <code>if</code> から <code>then</code> 等までの間にある、ということを明確にする。 C系の <code>if</code> 後に来る <code>(</code>/<code>)</code> や、Python の <code>:</code>、Rust/Go/Swift などの <code>{</code> も同じ役割を持つ。 @@ -209,39 +217,41 @@ <div class="filename"> parse.y </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">p_case_body : keyword_in -</div><div class="codeblock-line">{ -</div><div class="codeblock-line"> SET_LEX_STATE(EXPR_BEG|EXPR_LABEL); -</div><div class="codeblock-line"> p->command_start = FALSE; -</div><div class="codeblock-line"> $<ctxt>1 = p->ctxt; -</div><div class="codeblock-line"> p->ctxt.in_kwarg = 1; -</div><div class="codeblock-line"> $<tbl>$ = push_pvtbl(p); -</div><div class="codeblock-line">} -</div><div class="codeblock-line">{ -</div><div class="codeblock-line"> $<tbl>$ = push_pktbl(p); -</div><div class="codeblock-line">} -</div><div class="codeblock-line">p_top_expr then -</div><div class="codeblock-line">{ -</div><div class="codeblock-line"> pop_pktbl(p, $<tbl>3); -</div><div class="codeblock-line"> pop_pvtbl(p, $<tbl>2); -</div><div class="codeblock-line"> p->ctxt.in_kwarg = $<ctxt>1.in_kwarg; -</div><div class="codeblock-line">} -</div><div class="codeblock-line">compstmt -</div><div class="codeblock-line">p_cases -</div><div class="codeblock-line">{ -</div><div class="codeblock-line"> /*%%%*/ -</div><div class="codeblock-line"> $$ = NEW_IN($4, $7, $8, &@$); -</div><div class="codeblock-line"> /*% %*/ -</div><div class="codeblock-line"> /*% ripper: in!($4, $7, escape_Qundef($8)) %*/ -</div><div class="codeblock-line">} -</div><div class="codeblock-line">;</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">p_case_body : keyword_in +</span><span class="codeblock-line">{ +</span><span class="codeblock-line"> SET_LEX_STATE(EXPR_BEG|EXPR_LABEL); +</span><span class="codeblock-line"> p->command_start = FALSE; +</span><span class="codeblock-line"> $<ctxt>1 = p->ctxt; +</span><span class="codeblock-line"> p->ctxt.in_kwarg = 1; +</span><span class="codeblock-line"> $<tbl>$ = push_pvtbl(p); +</span><span class="codeblock-line">} +</span><span class="codeblock-line">{ +</span><span class="codeblock-line"> $<tbl>$ = push_pktbl(p); +</span><span class="codeblock-line">} +</span><span class="codeblock-line">p_top_expr then +</span><span class="codeblock-line">{ +</span><span class="codeblock-line"> pop_pktbl(p, $<tbl>3); +</span><span class="codeblock-line"> pop_pvtbl(p, $<tbl>2); +</span><span class="codeblock-line"> p->ctxt.in_kwarg = $<ctxt>1.in_kwarg; +</span><span class="codeblock-line">} +</span><span class="codeblock-line">compstmt +</span><span class="codeblock-line">p_cases +</span><span class="codeblock-line">{ +</span><span class="codeblock-line"> /*%%%*/ +</span><span class="codeblock-line"> $$ = NEW_IN($4, $7, $8, &@$); +</span><span class="codeblock-line"> /*% %*/ +</span><span class="codeblock-line"> /*% ripper: in!($4, $7, escape_Qundef($8)) %*/ +</span><span class="codeblock-line">} +</span><span class="codeblock-line">; +</span></code></pre> </div> <p> 簡略版: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">p_case_body : keyword_in p_top_expr then compstmt p_cases -</div><div class="codeblock-line">;</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">p_case_body : keyword_in p_top_expr then compstmt p_cases +</span><span class="codeblock-line">; +</span></code></pre> </div> <p> ここで、<code>keyword_in</code> は文字通り <code>in</code>、<code>p_top_expr</code> はいわゆるパターン、<code>then</code> は <code>then</code> キーワードのことではなく、この記事で <code>then</code> 等と呼んでいるもの、つまり <code>then</code> キーワード、<code>;</code>、改行のいずれかである。 @@ -250,36 +260,38 @@ これにより、<code>case</code> - <code>when</code> による従来の構文と同じように、<code>then</code> 等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">2</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">3</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> <p> ところで、<code>p_top_expr</code> には <code>if</code> による guard clause が書けるので、その場合は <code>if</code> - <code>then</code> と似たような見た目になる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> -</div><div class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> -</div><div class="codeblock-line"><span style="color: #cf222e">end</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">case</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">a</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #0550ae"><</span> <span style="color: #0550ae">0</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">b</span> +</span><span class="codeblock-line"><span style="color: #cf222e">in</span> <span style="color: #24292f;background-color: #f6f8fa">n</span> <span style="color: #cf222e">then</span> <span style="color: #24292f;background-color: #f6f8fa">c</span> +</span><span class="codeblock-line"><span style="color: #cf222e">end</span> +</span></code></pre> </div> </section> <section id="section--outro"> |
