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 | |
| 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')
7 files changed, 340 insertions, 302 deletions
diff --git a/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html b/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html index db3f0334..ea909c94 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/cpp-you-can-use-keywords-in-attributes/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【C++】 属性構文の属性名にはキーワードが使える|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"> @@ -72,41 +72,44 @@ タイトル落ち。まずはこのコードを見て欲しい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><iostream></span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignas</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">asm</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">auto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitand</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">bool</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">case</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">catch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char16_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char32_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">class</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">compl</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">constexpr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">decltype</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">default</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">delete</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">do</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">double</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">dynamic_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">else</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">enum</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">explicit</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">export</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">extern</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">false</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">final</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">float</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">friend</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">goto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">inline</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">long</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">mutable</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">namespace</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">new</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">noexcept</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">nullptr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">operator</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">override</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">private</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">protected</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">public</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">register</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">reinterpret_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">return</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">short</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">signed</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">sizeof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_assert</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">struct</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">switch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">template</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">this</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">thread_local</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">throw</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">true</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">try</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typedef</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typeid</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typename</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">union</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">unsigned</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">virtual</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">void</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">volatile</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">wchar_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">while</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> -</div><div class="codeblock-line"><span style="color: #6e7781">// [[using]]</span> -</div><div class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">cout</span> <span style="color: #0550ae"><<</span> <span style="color: #0a3069">"Hello, World!"</span> <span style="color: #0550ae"><<</span> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">endl</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">#include</span> <span style="color: #6e7781"><iostream></span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignas</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">alignof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">and_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">asm</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">auto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitand</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">bitor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">bool</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">break</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">case</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">catch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char16_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">char32_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">class</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">compl</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">const_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">constexpr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">continue</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">decltype</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">default</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">delete</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">do</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">double</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">dynamic_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">else</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">enum</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">explicit</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">export</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">extern</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">false</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">final</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">float</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">for</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">friend</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">goto</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">if</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">inline</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">int</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">long</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">mutable</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">namespace</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">new</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">noexcept</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">not_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">nullptr</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">operator</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">or_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">override</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">private</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">protected</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">public</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">register</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">reinterpret_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">return</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">short</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">signed</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">sizeof</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_assert</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">static_cast</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">struct</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">switch</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">template</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">this</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">thread_local</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">throw</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #953800">true</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">try</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typedef</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typeid</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">typename</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">union</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">unsigned</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">virtual</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">void</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">volatile</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">wchar_t</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">while</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #24292f;background-color: #f6f8fa">xor_eq</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> +</span><span class="codeblock-line"><span style="color: #6e7781">// [[using]]</span> +</span><span class="codeblock-line"><span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">cout</span> <span style="color: #0550ae"><<</span> <span style="color: #0a3069">"Hello, World!"</span> <span style="color: #0550ae"><<</span> <span style="color: #24292f;background-color: #f6f8fa">std</span><span style="color: #0550ae">::</span><span style="color: #24292f;background-color: #f6f8fa">endl</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</span></code></pre> </div> <p> コンパイラのバージョン </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ clang++ --version -</div><div class="codeblock-line">Apple clang version 11.0.0 (clang-1100.0.33.8) -</div><div class="codeblock-line">Target: x86_64-apple-darwin19.6.0 -</div><div class="codeblock-line">Thread model: posix -</div><div class="codeblock-line">InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">$ clang++ --version +</span><span class="codeblock-line">Apple clang version 11.0.0 (clang-1100.0.33.8) +</span><span class="codeblock-line">Target: x86_64-apple-darwin19.6.0 +</span><span class="codeblock-line">Thread model: posix +</span><span class="codeblock-line">InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin +</span></code></pre> </div> <p> コンパイルコマンド (C++17 指定) </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ clang --std=c++17 hoge.cpp</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">$ clang --std=c++17 hoge.cpp +</span></code></pre> </div> <p> この記事から得られるものはこれ以上ないので以下は蛇足になる。 @@ -136,8 +139,9 @@ 上のコードでは <code>[[using]]</code> をコメントアウトしているが、これは <code>using</code> キーワードのみ属性構文の中で意味を持つからであり、このコメントアウトを外すとコンパイルに失敗する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">// using の例</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">using</span> <span style="color: #24292f;background-color: #f6f8fa">foo</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">attr1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">attr2</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// [[foo::attr1, foo::attr2]] の糖衣構文</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">// using の例</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">[[</span><span style="color: #cf222e">using</span> <span style="color: #24292f;background-color: #f6f8fa">foo</span><span style="color: #0550ae">:</span> <span style="color: #24292f;background-color: #f6f8fa">attr1</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">attr2</span><span style="color: #24292f;background-color: #f6f8fa">]]</span> <span style="color: #cf222e">int</span> <span style="color: #24292f;background-color: #f6f8fa">x</span><span style="color: #24292f;background-color: #f6f8fa">;</span> <span style="color: #6e7781">// [[foo::attr1, foo::attr2]] の糖衣構文</span> +</span></code></pre> </div> <p> C++17 の仕様も見てみる (正確には標準化前のドラフト)。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html b/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html index a38d197c..aa63127f 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/python-unbound-local-error/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Python】 クロージャとUnboundLocalError: local variable 'x' referenced before assignment|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"> @@ -75,13 +75,14 @@ Python でクロージャを作ろうと、次のようなコードを書いた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> -</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> +</span><span class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</span></code></pre> </div> <p> 関数 <code>g</code> から 関数 <code>f</code> のスコープ内で定義された変数 <code>x</code> を参照し、それに 1 を足そうとしている。 これを実行すると <code>x += 1</code> の箇所でエラーが発生する。 @@ -95,27 +96,29 @@ local変数 <code>x</code> が代入前に参照された、とある。これは、<code>f</code> の <code>x</code> を参照するのではなく、新しく別の変数を <code>g</code> 内に作ってしまっているため。前述のコードを宣言と代入を便宜上分けて書き直すと次のようになる。<code>var</code> を変数宣言のための構文として擬似的に利用している。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781"># 注: var は正しい Python の文法ではない。上記参照のこと</span> -</div><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># f の local変数 'x' を宣言</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># x に 0 を代入</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #6e7781"># f の内部関数 g を定義</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># g の local変数 'x' を宣言</span> -</div><div class="codeblock-line"> <span style="color: #6e7781"># たまたま f にも同じ名前の変数があるが、それとは別の変数</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># x に 1 を加算 (x = x + 1 の糖衣構文)</span> -</div><div class="codeblock-line"> <span style="color: #6e7781"># 加算する前の値を参照しようとするが、まだ代入されていないためエラー</span> -</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781"># 注: var は正しい Python の文法ではない。上記参照のこと</span> +</span><span class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># f の local変数 'x' を宣言</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> <span style="color: #6e7781"># x に 0 を代入</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> <span style="color: #6e7781"># f の内部関数 g を定義</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">var</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781"># g の local変数 'x' を宣言</span> +</span><span class="codeblock-line"> <span style="color: #6e7781"># たまたま f にも同じ名前の変数があるが、それとは別の変数</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> <span style="color: #6e7781"># x に 1 を加算 (x = x + 1 の糖衣構文)</span> +</span><span class="codeblock-line"> <span style="color: #6e7781"># 加算する前の値を参照しようとするが、まだ代入されていないためエラー</span> +</span><span class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</span></code></pre> </div> <p> 当初の意図を表現するには、次のように書けばよい。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">nonlocal</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781">## (*)</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> -</div><div class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">def</span> <span style="color: #8250df">f</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">=</span> <span style="color: #0550ae">0</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">def</span> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">():</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">nonlocal</span> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #6e7781">## (*)</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">x</span> <span style="color: #0550ae">+=</span> <span style="color: #0550ae">1</span> +</span><span class="codeblock-line"> <span style="color: #8250df">g</span><span style="color: #24292f;background-color: #f6f8fa">()</span> +</span></code></pre> </div> <p> <code>(*)</code> のように、<code>nonlocal</code> を追加する。これにより一つ外側のスコープ (<code>g</code> の一つ外側 = <code>f</code>) で定義されている <code>x</code> を探しに行くようになる。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html b/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html index 0dfc31fd..c2083d44 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/ruby-detect-running-implementation/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Ruby】 自身を実行している処理系の種類を判定する|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"> @@ -81,12 +81,13 @@ 上記ページの例から引用する: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ruby-1.9.1 <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"ruby"</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>jruby <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"jruby"</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>ruby-1.9.1 <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"ruby"</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">$</span><span style="color: #24292f;background-color: #f6f8fa"> </span>jruby <span style="color: #116329">-ve</span> <span style="color: #0a3069">'p RUBY_ENGINE'</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java]</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">"jruby"</span> +</span></code></pre> </div> <p> それぞれの処理系がどのような値を返すかだが、stack overflow に良い質問と回答があった。 @@ -96,16 +97,17 @@ </p> <blockquote> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">| RUBY_ENGINE | Implementation | -</div><div class="codeblock-line">|:-----------:|:------------------| -</div><div class="codeblock-line">| <undefined> | MRI < 1.9 | -</div><div class="codeblock-line">| 'ruby' | MRI >= 1.9 or REE | -</div><div class="codeblock-line">| 'jruby' | JRuby | -</div><div class="codeblock-line">| 'macruby' | MacRuby | -</div><div class="codeblock-line">| 'rbx' | Rubinius | -</div><div class="codeblock-line">| 'maglev' | MagLev | -</div><div class="codeblock-line">| 'ironruby' | IronRuby | -</div><div class="codeblock-line">| 'cardinal' | Cardinal |</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">| RUBY_ENGINE | Implementation | +</span><span class="codeblock-line">|:-----------:|:------------------| +</span><span class="codeblock-line">| <undefined> | MRI < 1.9 | +</span><span class="codeblock-line">| 'ruby' | MRI >= 1.9 or REE | +</span><span class="codeblock-line">| 'jruby' | JRuby | +</span><span class="codeblock-line">| 'macruby' | MacRuby | +</span><span class="codeblock-line">| 'rbx' | Rubinius | +</span><span class="codeblock-line">| 'maglev' | MagLev | +</span><span class="codeblock-line">| 'ironruby' | IronRuby | +</span><span class="codeblock-line">| 'cardinal' | Cardinal | +</span></code></pre> </div> </blockquote> <p> @@ -121,10 +123,11 @@ <div class="filename"> version.h </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/*</span> -</div><div class="codeblock-line"><span style="color: #6e7781"> * Ruby engine.</span> -</div><div class="codeblock-line"><span style="color: #6e7781"> */</span> -</div><div class="codeblock-line"><span style="color: #6e7781">#define MRUBY_RUBY_ENGINE "mruby"</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">/*</span> +</span><span class="codeblock-line"><span style="color: #6e7781"> * Ruby engine.</span> +</span><span class="codeblock-line"><span style="color: #6e7781"> */</span> +</span><span class="codeblock-line"><span style="color: #6e7781">#define MRUBY_RUBY_ENGINE "mruby"</span> +</span></code></pre> </div> </div> </article> 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"> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html b/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html index cf40ebf7..fea2aab4 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/rust-where-are-primitive-types-from/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Rust のプリミティブ型はどこからやって来るか|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"> @@ -88,26 +88,27 @@ Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> -</div><div class="codeblock-line"><span style="color: #8250df">#![allow(dead_code)]</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">;</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> +</span><span class="codeblock-line"><span style="color: #8250df">#![allow(dead_code)]</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span></code></pre> </div> <p> では、普段単に <code>bool</code> と書いたとき、この <code>bool</code> は一体どこから来ているのか。rustc のソースを追ってみた。 @@ -134,23 +135,25 @@ <code>rustc</code> はセルフホストされている (= <code>rustc</code> 自身が Rust で書かれている) ので、<code>bool</code> や <code>char</code> などで適当に検索をかけてもノイズが多すぎて話にならない。しかし、お誂え向きなことに <code>i128</code>/<code>u128</code> というコンパイラ自身が使うことがなさそうな型が存在するのでこれを使って <code>git grep</code> してみる。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ git grep "\bi128\b" | wc # i128 -</div><div class="codeblock-line">165 1069 15790 -</div><div class="codeblock-line"> -</div><div class="codeblock-line">$ git grep "\bu128\b" | wc # u128 -</div><div class="codeblock-line">293 2127 26667 -</div><div class="codeblock-line"> -</div><div class="codeblock-line">$ git grep "\bbool\b" | wc # cf. bool の結果 -</div><div class="codeblock-line">3563 23577 294659</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">$ git grep "\bi128\b" | wc # i128 +</span><span class="codeblock-line">165 1069 15790 +</span><span class="codeblock-line"> +</span><span class="codeblock-line">$ git grep "\bu128\b" | wc # u128 +</span><span class="codeblock-line">293 2127 26667 +</span><span class="codeblock-line"> +</span><span class="codeblock-line">$ git grep "\bbool\b" | wc # cf. bool の結果 +</span><span class="codeblock-line">3563 23577 294659 +</span></code></pre> </div> <p> 165 程度であれば探すことができそうだ。今回は、クレート名を見ておおよその当たりをつけた。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">$ git grep "\bi128\b" -</div><div class="codeblock-line">... -</div><div class="codeblock-line">rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); -</div><div class="codeblock-line">...</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">$ git grep "\bi128\b" +</span><span class="codeblock-line">... +</span><span class="codeblock-line">rustc_resolve/src/lib.rs: table.insert(sym::i128, Int(IntTy::I128)); +</span><span class="codeblock-line">... +</span></code></pre> </div> <p> <code>rustc_resolve</code> というのはいかにも名前解決を担いそうなクレート名である。該当箇所を見てみる。 @@ -159,72 +162,75 @@ <div class="filename"> rustc_resolve/src/lib.rs </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/// Interns the names of the primitive types.</span> -</div><div class="codeblock-line"><span style="color: #6e7781">///</span> -</div><div class="codeblock-line"><span style="color: #6e7781">/// All other types are defined somewhere and possibly imported, but the primitive ones need</span> -</div><div class="codeblock-line"><span style="color: #6e7781">/// special handling, since they have no place of origin.</span> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">FxHashMap</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">Symbol</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">PrimTy</span><span style="color: #0550ae">></span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">impl</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">fn</span> <span style="color: #8250df">new</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #cf222e">-></span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #0550ae">=</span> <span style="color: #953800">FxHashMap</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">default</span><span style="color: #24292f;background-color: #f6f8fa">();</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Bool</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Char</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Isize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Str</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Usize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">Self</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">/// Interns the names of the primitive types.</span> +</span><span class="codeblock-line"><span style="color: #6e7781">///</span> +</span><span class="codeblock-line"><span style="color: #6e7781">/// All other types are defined somewhere and possibly imported, but the primitive ones need</span> +</span><span class="codeblock-line"><span style="color: #6e7781">/// special handling, since they have no place of origin.</span> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">FxHashMap</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">Symbol</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">PrimTy</span><span style="color: #0550ae">></span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">impl</span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">fn</span> <span style="color: #8250df">new</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #cf222e">-></span> <span style="color: #24292f;background-color: #f6f8fa">PrimitiveTypeTable</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #0550ae">=</span> <span style="color: #953800">FxHashMap</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">default</span><span style="color: #24292f;background-color: #f6f8fa">();</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Bool</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">char</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Char</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">f64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Float</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">FloatTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">F64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">isize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Isize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">i128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Int</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">IntTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">I128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">str</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">Str</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">usize</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Usize</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u8</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U8</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u16</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U16</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u32</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U32</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u64</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U64</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">table</span><span style="color: #8250df">.insert</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">sym</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">u128</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #8250df">Uint</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">UintTy</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">U128</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">Self</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> <span style="color: #24292f;background-color: #f6f8fa">primitive_types</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">table</span> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</span></code></pre> </div> <p> これは初めに列挙したプリミティブ型の一覧と一致している。doc comment にも、 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">All other types are defined somewhere and possibly imported, but the -</div><div class="codeblock-line">primitive ones need special handling, since they have no place of -</div><div class="codeblock-line">origin.</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">All other types are defined somewhere and possibly imported, but the +</span><span class="codeblock-line">primitive ones need special handling, since they have no place of +</span><span class="codeblock-line">origin. +</span></code></pre> </div> <p> とある。次はこの struct の使用箇所を追う。追うと言っても使われている箇所は次の一箇所しかない。なお説明に不要な箇所は大きく削っている。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.</span> -</div><div class="codeblock-line"><span style="color: #6e7781">/// (略)</span> -</div><div class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">resolve_ident_in_lexical_scope</span><span style="color: #24292f;background-color: #f6f8fa">(</span> -</div><div class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #cf222e">mut</span> <span style="color: #cf222e">self</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Ident</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">ns</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #6e7781">// (略)</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">-></span> <span style="color: #953800">Option</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">LexicalScopeBinding</span><span style="color: #0550ae"><</span><span style="color: #0550ae">'a</span><span style="color: #0550ae">>></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #6e7781">// (略)</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">ns</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">TypeNS</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #cf222e">let</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">.primitive_type_table.primitive_types</span><span style="color: #8250df">.get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #0550ae">.name</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">binding</span> <span style="color: #0550ae">=</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Res</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">PrimTy</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">ty</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">Visibility</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Public</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">DUMMY_SP</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">ExpnId</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">root</span><span style="color: #24292f;background-color: #f6f8fa">())</span> -</div><div class="codeblock-line"> <span style="color: #8250df">.to_name_binding</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">self</span><span style="color: #0550ae">.arenas</span><span style="color: #24292f;background-color: #f6f8fa">);</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">LexicalScopeBinding</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">Item</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">binding</span><span style="color: #24292f;background-color: #f6f8fa">));</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"> <span style="color: #953800">None</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">/// This resolves the identifier `ident` in the namespace `ns` in the current lexical scope.</span> +</span><span class="codeblock-line"><span style="color: #6e7781">/// (略)</span> +</span><span class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">resolve_ident_in_lexical_scope</span><span style="color: #24292f;background-color: #f6f8fa">(</span> +</span><span class="codeblock-line"> <span style="color: #0550ae">&</span><span style="color: #cf222e">mut</span> <span style="color: #cf222e">self</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">mut</span> <span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Ident</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">ns</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #24292f;background-color: #f6f8fa">Namespace</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #6e7781">// (略)</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #cf222e">-></span> <span style="color: #953800">Option</span><span style="color: #0550ae"><</span><span style="color: #24292f;background-color: #f6f8fa">LexicalScopeBinding</span><span style="color: #0550ae"><</span><span style="color: #0550ae">'a</span><span style="color: #0550ae">>></span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #6e7781">// (略)</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #24292f;background-color: #f6f8fa">ns</span> <span style="color: #0550ae">==</span> <span style="color: #24292f;background-color: #f6f8fa">TypeNS</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">if</span> <span style="color: #cf222e">let</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #0550ae">=</span> <span style="color: #cf222e">self</span><span style="color: #0550ae">.primitive_type_table.primitive_types</span><span style="color: #8250df">.get</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">&</span><span style="color: #24292f;background-color: #f6f8fa">ident</span><span style="color: #0550ae">.name</span><span style="color: #24292f;background-color: #f6f8fa">)</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">binding</span> <span style="color: #0550ae">=</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">Res</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">PrimTy</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0550ae">*</span><span style="color: #24292f;background-color: #f6f8fa">prim_ty</span><span style="color: #24292f;background-color: #f6f8fa">),</span> <span style="color: #953800">ty</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #953800">Visibility</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #24292f;background-color: #f6f8fa">Public</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">DUMMY_SP</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #953800">ExpnId</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">root</span><span style="color: #24292f;background-color: #f6f8fa">())</span> +</span><span class="codeblock-line"> <span style="color: #8250df">.to_name_binding</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #cf222e">self</span><span style="color: #0550ae">.arenas</span><span style="color: #24292f;background-color: #f6f8fa">);</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">return</span> <span style="color: #8250df">Some</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #953800">LexicalScopeBinding</span><span style="color: #24292f;background-color: #f6f8fa">::</span><span style="color: #8250df">Item</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #24292f;background-color: #f6f8fa">binding</span><span style="color: #24292f;background-color: #f6f8fa">));</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">}</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"> <span style="color: #953800">None</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</span></code></pre> </div> <p> 関数名や doc comment が示している通り、この関数は識別子 (identifier, ident) を現在のレキシカルスコープ内で解決 (resolve) する。<code>if ns == TypeNS</code> のブロック内では、<code>primitive_type_table</code> (上記の <code>PrimitiveTypeTable::new()</code> で作られた変数) に含まれている識別子 (<code>bool</code>、<code>i32</code> など) かどうか判定し、そうであればそれに紐づけられたプリミティブ型を返している。 @@ -239,13 +245,14 @@ 動作がわかったところで、例として次のコードを考える。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">bool</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #8250df">#![allow(non_camel_case_types)]</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">struct</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line"><span style="color: #cf222e">fn</span> <span style="color: #8250df">main</span><span style="color: #24292f;background-color: #f6f8fa">()</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #cf222e">let</span> <span style="color: #24292f;background-color: #f6f8fa">_</span><span style="color: #24292f;background-color: #f6f8fa">:</span> <span style="color: #953800">bool</span> <span style="color: #0550ae">=</span> <span style="color: #953800">bool</span><span style="color: #24292f;background-color: #f6f8fa">;</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">}</span> +</span></code></pre> </div> <p> ここで <code>main()</code> の <code>bool</code> は <code>struct bool</code> として解決される。なぜなら、プリミティブ型の判定をする前に <code>bool</code> という名前の別の型が見つかるからだ。 diff --git a/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html b/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html index 301dcfdc..d3b081f7 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/vim-difference-between-autocmd-bufwrite-and-bufwritepre/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>【Vim】 autocmd events の BufWrite/BufWritePre の違い|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"> @@ -146,8 +146,9 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufAdd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufCreate"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufAdd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufCreate"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFADD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span></code></pre> </div> <p> <a class="url" href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97" rel="noreferrer" target="_blank">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97</a> @@ -156,9 +157,10 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufRead"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadCmd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADCMD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadPost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufRead"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadCmd"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADCMD</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufReadPost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFREADPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span></code></pre> </div> <p> <a class="url" href="https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105" rel="noreferrer" target="_blank">https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105</a> @@ -167,9 +169,10 @@ <div class="filename"> src/autocmd.c </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWrite"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePre"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWrite"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePost"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPOST</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">{</span><span style="color: #0a3069">"BufWritePre"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #24292f;background-color: #f6f8fa">EVENT_BUFWRITEPRE</span><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span></code></pre> </div> </section> <section id="section--code-reading--neovim"> @@ -184,12 +187,13 @@ <div class="filename"> src/nvim/auevents.lua </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">aliases</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufCreate</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufAdd'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufRead</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufReadPost'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufWrite</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">FileEncoding</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'EncodingChanged'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> -</div><div class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">},</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">aliases</span> <span style="color: #0550ae">=</span> <span style="color: #24292f;background-color: #f6f8fa">{</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufCreate</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufAdd'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufRead</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufReadPost'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">BufWrite</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'BufWritePre'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"> <span style="color: #24292f;background-color: #f6f8fa">FileEncoding</span> <span style="color: #0550ae">=</span> <span style="color: #0a3069">'EncodingChanged'</span><span style="color: #24292f;background-color: #f6f8fa">,</span> +</span><span class="codeblock-line"><span style="color: #24292f;background-color: #f6f8fa">},</span> +</span></code></pre> </div> <p> ところで、上では取り上げなかった <code>FileEncoding</code> だが、これは <code>:help FileEncoding</code> にしっかりと書いてある。 @@ -198,9 +202,10 @@ <div class="filename"> :help FileEncoding </div> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"> *FileEncoding* -</div><div class="codeblock-line">FileEncoding Obsolete. It still works and is equivalent -</div><div class="codeblock-line"> to |EncodingChanged|.</div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"> *FileEncoding* +</span><span class="codeblock-line">FileEncoding Obsolete. It still works and is equivalent +</span><span class="codeblock-line"> to |EncodingChanged|. +</span></code></pre> </div> </section> </section> diff --git a/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html b/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html index 42a946c2..eb1c34c0 100644 --- a/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html +++ b/services/nuldoc/public/blog/posts/2021-10-02/vim-swap-order-of-selected-lines/index.html @@ -15,7 +15,7 @@ <meta name="Hatena::Bookmark" content="nocomment"> <link rel="icon" type="image/svg+xml" href="/favicon.svg"> <title>Vimで選択した行の順番を入れ替える|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"> @@ -102,11 +102,12 @@ <section id="section--tl-dr"> <h2><a href="#section--tl-dr">TL; DR</a></h2> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #6e7781">" License: Public Domain</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #6e7781">" License: Public Domain</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> +</span></code></pre> </div> </section> <section id="section--version"> @@ -164,9 +165,10 @@ なお、<code>:g/^/m0</code> は全ての行を入れ替えるが、<code>:N,Mg/^/mN-1</code> とすることで N行目から M行目を処理範囲とするよう拡張できる。手でこれを入力するわけにはいかないので、次のようなコマンドを用意する。 </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> +</span></code></pre> </div> <p> これは望みの動作をするが、実際に実行してみると全行がハイライトされてしまう。次節で詳細を述べる。 @@ -200,13 +202,14 @@ 前述した <code>:Reverse</code> コマンドの定義を少し変えて、次のようにする: </p> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line"><span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #0550ae">s:reverse_lines</span><span style="color: #24292f;background-color: #f6f8fa">(</span>from<span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">to</span><span style="color: #24292f;background-color: #f6f8fa">)</span> abort -</div><div class="codeblock-line"> <span style="color: #953800">execute</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d,%dg/^/m%d"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:to</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> -</div><div class="codeblock-line"><span style="color: #cf222e">endfunction</span> -</div><div class="codeblock-line"> -</div><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">call</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>SID<span style="color: #24292f;background-color: #f6f8fa">></span>reverse_lines<span style="color: #24292f;background-color: #f6f8fa">(<</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line2<span style="color: #24292f;background-color: #f6f8fa">>)</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line"><span style="color: #cf222e">function</span><span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #0550ae">s:reverse_lines</span><span style="color: #24292f;background-color: #f6f8fa">(</span>from<span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #cf222e">to</span><span style="color: #24292f;background-color: #f6f8fa">)</span> abort +</span><span class="codeblock-line"> <span style="color: #953800">execute</span> <span style="color: #953800">printf</span><span style="color: #24292f;background-color: #f6f8fa">(</span><span style="color: #0a3069">"%d,%dg/^/m%d"</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:to</span><span style="color: #24292f;background-color: #f6f8fa">,</span> <span style="color: #0550ae">a:from</span> <span style="color: #24292f;background-color: #f6f8fa">-</span> <span style="color: #0550ae">1</span><span style="color: #24292f;background-color: #f6f8fa">)</span> +</span><span class="codeblock-line"><span style="color: #cf222e">endfunction</span> +</span><span class="codeblock-line"> +</span><span class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">call</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>SID<span style="color: #24292f;background-color: #f6f8fa">></span>reverse_lines<span style="color: #24292f;background-color: #f6f8fa">(<</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line2<span style="color: #24292f;background-color: #f6f8fa">>)</span> +</span></code></pre> </div> <p> 実行しているコマンドが変わったわけではないが、関数呼び出しを経由するようにした。これだけで前述の問題が解決する。 @@ -253,9 +256,10 @@ </div> </div> <div class="codeblock"> - <pre class="highlight" style="background-color:#f5f5f5"><code><div class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse -</div><div class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span></div></code></pre> + <pre class="highlight" style="background-color:#f5f5f5"><code><span class="codeblock-line">command<span style="color: #24292f;background-color: #f6f8fa">!</span> <span style="color: #24292f;background-color: #f6f8fa">-</span>bar <span style="color: #24292f;background-color: #f6f8fa">-</span><span style="color: #953800">range</span><span style="color: #24292f;background-color: #f6f8fa">=</span>% +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> Reverse +</span><span class="codeblock-line"><span style="color: #0a3069"> \</span> <span style="color: #cf222e">keeppatterns</span> <span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">>,<</span>line2<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #cf222e">g</span><span style="color: #116329">/^/</span><span style="color: #cf222e">m</span><span style="color: #24292f;background-color: #f6f8fa"><</span>line1<span style="color: #24292f;background-color: #f6f8fa">></span><span style="color: #0550ae">-1</span> +</span></code></pre> </div> <p> まさにこのための Exコマンド、<code>:keeppatterns</code> が存在する。<code>:keeppatterns {command}</code> のように使い、読んで字の如く、後ろに続く Exコマンドを「現在の検索パターンを保ったまま」実行する。はるかに分かりやすく意図を表現できる。 |
