From db3d51ddc421dad68abddb95d01ffdab440197d6 Mon Sep 17 00:00:00 2001
From: nsfisis
case - in によるパターンマッチング構文でも、case - when と同じように then が使える (場合によっては使う必要がある)。
then とはthen とは
使われることは稀だが、Ruby では then がキーワードになっている。次のように使う:
普通 Ruby のコードで then を書くことはない。なぜか。次のコードを実行してみるとわかる。
then や ; や改行が必要かthen や ; や改行が必要か
なぜ then や ; や改行 (以下 「then 等」) が必要なのだろうか。次の例を見てほしい:
case - in における thencase - in における then
ようやく本題にたどり着いた。来る Ruby 3.0 では case と in キーワードを使ったパターンマッチングの構文が入る予定である。この構文でもパターン部との区切りとして then 等が必要になる。 (現在の) Ruby には formal な形式での文法仕様は存在しないので、yacc の定義ファイルを参照した (yacc の説明は省略)。
if や case の条件の後ろには then、;、改行のいずれかが必要
diff --git a/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html b/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
index 9e77a85..8c6e269 100644
--- a/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
+++ b/public/posts/2021-10-02/rust-where-are-primitive-types-from/index.html
@@ -62,8 +62,8 @@
- Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。
@@ -100,8 +100,8 @@調査に使用したソース (調査時点での最新 master)
@@ -242,8 +242,8 @@ rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128));Rust のプリミティブ型は予約語ではない。名前解決の最終段階で特別扱いされ、他に同名の型が見つかっていなければ対応するプリミティブ型に解決される。
diff --git a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html index 44ee689..b9455f7 100644 --- a/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html +++ b/public/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html @@ -62,15 +62,15 @@ -違いはない。ただのエイリアス。
Vim の autocmd events には似通った名前のものがいくつかある。大抵は :help に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。
以下は、autocmd events の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。
@@ -139,8 +139,8 @@ {"BufWritePre", EVENT_BUFWRITEPRE},
neovim の場合でも同様のマッピングが定義されているが、こちらの場合は Lua で書かれている。以下にある通り、はっきり aliases と書かれている。
FileEncoding だが、これは :help FileEncoding にしっかりと書いてある。
- *FileEncoding*
- FileEncoding Obsolete. It still works and is equivalent
+ *FileEncoding*
+FileEncoding Obsolete. It still works and is equivalent
to |EncodingChanged|.
+ 記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。 +
-- 記事タイトルについて言えば、どちらも変わらないので好きな方を使えばよい。あえて言えば、次のようになるだろう。 -
+BufAdd/BufCreate
+ BufCreate は歴史的な理由により ("for historic reasons") 存在しているため、新しい方 (BufAdd) を使う
+ BufAdd/BufCreate
- BufCreate は歴史的な理由により ("for historic reasons") 存在しているため、新しい方 (BufAdd) を使う
- BufRead/BufReadPost
- BufReadPre との対称性のため、あるいは BufWritePost との対称性のため BufReadPost を使う
- BufWrite/BufWritePre
- BufWritePost との対称性のため、あるいは BufReadPre との対称性のため BufWritePre を使う
- FileEncoding/EncodingChanged
- FileEncoding は `Obsolete'' と明言されているので、`EncodingChanged を使う
- BufRead/BufReadPost
+ BufReadPre との対称性のため、あるいは BufWritePost との対称性のため BufReadPost を使う
+
- ところでこの調査で知ったのだが、BufRead と BufWrite は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら Pre/Post 付きのものを使った方が分かりやすいだろう。
-
BufWrite/BufWritePre
+ BufWritePost との対称性のため、あるいは BufReadPre との対称性のため BufWritePre を使う
+ FileEncoding/EncodingChanged
+ FileEncoding は `Obsolete'' と明言されているので、`EncodingChanged を使う
+
+ ところでこの調査で知ったのだが、BufRead と BufWrite は上にある通り発火するタイミングが「後」と「前」で対称性がない。可能なら Pre/Post 付きのものを使った方が分かりやすいだろう。
+
" License: Public Domain
+
+command! -bar -range=%
+ \ Reverse
+ \ keeppatterns <line1>,<line2>g/^/m<line1>-1
+
:version の一部
tac / tailtac / tail
tac や tail -r などの外部コマンドを ! を使って呼び出し、置き換える。
:g/^/m0:g/^/m0
こちらは外部コマンドに頼らず、Vim の機能のみを使う。g は :global コマンドの、m は :move コマンドの略
:g/^/m0 の問題点:g/^/m0 の問題点
:global コマンドは各行に対してマッチングを行う際、現在の検索パターンを上書きしてしまう。^ は行の先頭にマッチするため、結果として全ての行がハイライトされてしまう。'hlsearch' オプションを無効にしている場合その限りではないが、その場合でも直前の検索パターンが失われてしまうと n コマンドなどの際に不便である。
[2020/9/28追記] より簡潔な方法を見つけたので次節に追記した @@ -212,8 +221,8 @@ command! -bar -range=%
[2020/9/28追記] より簡潔な方法を見つけたため追記する @@ -234,15 +243,6 @@ command! -bar -range=%
" License: Public Domain
-
-command! -bar -range=%
- \ Reverse
- \ keeppatterns <line1>,<line2>g/^/m<line1>-1
-