From 0766039bd9e6b9f5e6334e84666f5be698d41fc3 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 17 Mar 2023 01:35:04 +0900 Subject: feat(nuldoc): implement syntax highlight --- .../ruby-then-keyword-and-case-in/index.html | 108 ++++++++++----------- 1 file changed, 54 insertions(+), 54 deletions(-) (limited to 'public/posts/2021-10-02/ruby-then-keyword-and-case-in') diff --git a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html index 49127f6..f66ae0b 100644 --- a/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html +++ b/public/posts/2021-10-02/ruby-then-keyword-and-case-in/index.html @@ -10,7 +10,7 @@ 【Ruby】 then キーワードと case in | REPL: Rest-Eat-Program Loop - +
@@ -75,36 +75,36 @@ 使われることは稀だが、Ruby ではthenがキーワードになっている。次のように使う:

-
if cond then
-  puts "Y"
-  else
-  puts "N"
-  end
+
if cond then
+  puts "Y"
+  else
+  puts "N"
+  end

このキーワードが現れうる場所はいくつかあり、ifunlessrescuecase構文がそれに当たる。 上記のように、何か条件を書いた後thenを置き、式がそこで終了していることを示すマーカーとして機能する。

-
# Example:
+            
# Example:
 
-if x then
+if x then
 a
-end
+end
 
-unless x then
+unless x then
 a
-end
+end
 
-begin
+begin
 a
-rescue then
+rescue then
 b
-end
+end
 
-case x
-when p then
+case x
+when p then
 a
-end
+end
@@ -113,17 +113,17 @@ end 普通 Ruby のコードでthenを書くことはない。なぜか。次のコードを実行してみるとわかる。

-
if true puts 'Hello, World!' end
+
if true puts 'Hello, World!' end

次のような構文エラーが出力される。

-
20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
-if true puts 'Hello, World!' end
+            
20:1: syntax error, unexpected local variable or method, expecting `then' or ';' or '\n'
+if true puts 'Hello, World!' end
         ^~~~
-20:1: syntax error, unexpected `end', expecting end-of-input
-...f true puts 'Hello, World!' end
+20:1: syntax error, unexpected `end', expecting end-of-input +...f true puts 'Hello, World!' end

二つ目のメッセージは無視して一つ目を読むと、then;か改行が来るはずのところ変数だかメソッドだかが現れたことによりエラーとなっているようだ。 @@ -133,8 +133,8 @@ if true puts 'Hello, World!' end ポイントは改行がthen(や;) の代わりとなることである。trueの後に改行を入れてみる。

-
if true
-puts 'Hello, World!' end
+
if true
+puts 'Hello, World!' end

無事 Hello, World! と出力されるようになった。 @@ -147,21 +147,21 @@ puts 'Hello, World!' end なぜthen;や改行 (以下 「then等」) が必要なのだろうか。次の例を見てほしい:

-
if a b end
+
if a b end

then;も改行もないのでエラーになるが、これは条件式がどこまで続いているのかわからないためだ。 この例は二通りに解釈できる。

-
# a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
-if a then
+            
# a という変数かメソッドの評価結果が truthy なら b という変数かメソッドを評価
+if a then
 b
-end
+end
-
# a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
-# その結果が truthy なら何もしない
-if a(b) then
-end
+
# a というメソッドに b という変数かメソッドの評価結果を渡して呼び出し、
+# その結果が truthy なら何もしない
+if a(b) then
+end

then等はこの曖昧性を排除するためにあり、条件式はifからthen等までの間にある、ということを明確にする。 C系のif後に来る(/)や、Python の:、Rust/Go/Swift などの{も同じ役割を持つ。 @@ -182,7 +182,7 @@ end https://github.com/ruby/ruby/blob/221ca0f8281d39f0dfdfe13b2448875384bbf735/parse.y#L3961-L3986

-
p_case_body : keyword_in
+            
p_case_body : keyword_in
   {
   SET_LEX_STATE(EXPR_BEG|EXPR_LABEL);
   p->command_start = FALSE;
@@ -213,7 +213,7 @@ end
簡略版:

-
p_case_body : keyword_in p_top_expr then compstmt p_cases
+            
p_case_body : keyword_in p_top_expr then compstmt p_cases
 ;

@@ -224,36 +224,36 @@ end

これにより、case-whenによる従来の構文と同じように、then等をパターンの後ろに挿入すればよいことがわかった。つまり次の3通りのいずれかになる:

-
case x
-in 1 then a
-in 2 then b
-in 3 then c
-end
+            
case x
+in 1 then a
+in 2 then b
+in 3 then c
+end
 
-case x
-in 1
+case x
+in 1
 a
-in 2
+in 2
 b
-in 3
+in 3
 c
-end
+end
 
-case x
-in 1; a
-in 2; b
-in 3; c
-end
+case x +in 1; a +in 2; b +in 3; c +end

ところで、p_top_exprにはifによる guard clause が書けるので、その場合はif-thenと似たような見た目になる。

-
case x
-in 0 then a
-in n if n < 0 then b
-in n then c
-end
+
case x
+in 0 then a
+in n if n < 0 then b
+in n then c
+end
-- cgit v1.2.3-70-g09d2