diff options
Diffstat (limited to 'docs/index.html')
| -rw-r--r-- | docs/index.html | 129 |
1 files changed, 128 insertions, 1 deletions
diff --git a/docs/index.html b/docs/index.html index ec9c8f8..8e18578 100644 --- a/docs/index.html +++ b/docs/index.html @@ -16,7 +16,7 @@ <link rel="apple-touch-icon" href="https://nsfisis.github.io/apple-touch-icon.png"> <link rel="icon" href="https://nsfisis.github.io/favicon.ico"> - <meta name="generator" content="Hugo 0.81.0" /> + <meta name="generator" content="Hugo 0.88.1" /> <link rel="alternate" type="application/rss+xml" href="https://nsfisis.github.io/index.xml" title="REPL: Rest-Eat-Program Loop" /> @@ -81,6 +81,133 @@ <article class="first-entry"> <header class="entry-header"> + <h2>Rust のプリミティブ型はどこからやって来るか</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/9a429432258bbcd6c565 + 前置き Rust において、プリミティブ型の名前は予約語でない。したがって、次のコードは合法である。 +#![allow(non_camel_case_types)] #![allow(dead_code)] struct bool; struct char; struct i8; struct i16; struct i32; struct i64; struct i128; struct isize; struct u8; struct u16; struct u32; struct u64; struct u128; struct usize; struct f32; struct f64; struct str; では、普段単に bool と書いたとき、この bool は一体どこから来ているのか。rustc のソースを追ってみた。 + 前提知識: 一般的なコンパイラの構造、用語。rustc そのものの知識は不要 (というよりも筆者自身がよく知らない) + 調査 調査に使用したソース (調査時点での最新 master) +https://github.com/rust-lang/rust/tree/511ed9f2356af365ad8affe046b3dd33f7ac3c98 +どのようにして調べるか。rustc の構造には詳しくないため、すぐに当たりをつけるのは難しい。 +大雑把な構造としては、compiler フォルダ以下に rustc_* という名前のクレートが数十個入っている。これがどうやら rustc コマンドの実装部のようだ。...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/rust-where-are-primitive-types-from/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>[Ruby] then キーワードと case in</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/787a8cf888a304497223 + TL; DR case - in によるパターンマッチング構文でも、case - when と同じように then が使える (場合によっては使う必要がある)。 +then とは 使われることは稀だが、Ruby では then がキーワードになっている。次のように使う: +if cond then puts "Y" else puts "N" end このキーワードが現れうる場所はいくつかあり、if、unless、rescue、case 構文がそれに当たる。 上記のように、何か条件を書いた後 then を置き、式がそこで終了していることを示すマーカーとして機能する。 +# Example: if x then a end unless x then a end begin a rescue then b end case x when p then a end なぜ普段は書かなくてもよいのか 普通 Ruby のコードで then を書くことはない。なぜか。次のコードを実行してみるとわかる。...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/ruby-then-keyword-and-case-in/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>[C++] 属性構文の属性名にはキーワードが使える [[void]] [[for]]</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/94090937bcf860cfa93b + タイトル落ち。まずはこのコードを見て欲しい。 +#include <iostream> [[alignas]] [[alignof]] [[and]] [[and_eq]] [[asm]] [[auto]] [[bitand]] [[bitor]] [[bool]] [[break]] [[case]] [[catch]] [[char]] [[char16_t]] [[char32_t]] [[class]] [[compl]] [[const]] [[const_cast]] [[constexpr]] [[continue]] [[decltype]] [[default]] [[delete]] [[do]] [[double]] [[dynamic_cast]] [[else]] [[enum]] [[explicit]] [[export]] [[extern]] [[false]] [[final]] [[float]] [[for]] [[friend]] [[goto]] [[if]] [[inline]] [[int]] [[long]] [[mutable]] [[namespace]] [[new]] [[noexcept]] [[not]] [[not_eq]] [[nullptr]] [[operator]] [[or]] [[or_eq]] [[override]] [[private]] [[protected]] [[public]] [[register]] [[reinterpret_cast]] [[return]] [[short]] [[signed]] [[sizeof]] [[static]] [[static_assert]] [[static_cast]] [[struct]] [[switch]] [[template]] [[this]] [[thread_local]] [[throw]] [[true]] [[try]] [[typedef]] [[typeid]] [[typename]] [[union]] [[unsigned]] [[virtual]] [[void]] [[volatile]] [[wchar_t]] [[while]] [[xor]] [[xor_eq]] // [[using]] int main() { std::cout << "Hello, World!...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/cpp-you-can-use-keywords-in-attributes/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>[Ruby] 自身を実行している処理系の種類を判定する</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/74d7ffeeebc51b20d791 + Ruby という言語には複数の実装があるが、それらをスクリプト上からどのようにして programmatically に見分ければよいだろうか。 +Object クラスに定義されている RUBY_ENGINE という定数がこの用途に使える。 +参考: Object::RUBY_ENGINE +上記ページの例から引用する: +$ ruby-1.9.1 -ve 'p RUBY_ENGINE' ruby 1.9.1p0 (2009-03-04 revision 22762) [x86_64-linux] "ruby" $ jruby -ve 'p RUBY_ENGINE' jruby 1.2.0 (ruby 1.8.6 patchlevel 287) (2009-03-16 rev 9419) [i386-java] "jruby" それぞれの処理系がどのような値を返すかだが、stack overflow に良い質問と回答があった。 +What values for RUBY_ENGINE correspond to which Ruby implementations? より引用: + RUBY_ENGINE Implementation <undefined> MRI < 1....</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/ruby-detect-running-implementation/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>Vimで選択した行の順番を入れ替える</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/4fefb361d9a693803520 + バージョン情報 :version の一部 + VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 26 2020 11:30:30) macOS version Included patches: 1-148 Huge version without GUI. + よく紹介されている手法 tac / tail tac や tail -r などの外部コマンドを ! を使って呼び出し、置き換える。 + :h v_! + tac コマンドや tail の -r オプションは環境によって利用できないことがあり、複数の環境を行き来する場合に採用しづらい +:g/^/m0 こちらは外部コマンドに頼らず、Vim の機能のみを使う。g は :global コマンドの、m は :move コマンドの略 +:global コマンドは :[range]global/{pattern}/[command] のように使い、[range] で指定された範囲の行のうち、{pattern} で指定された検索パターンにマッチする行に対して、順番に [command] で指定された Ex コマンドを呼び出す。...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/vim-swap-order-of-selected-lines/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>[Vim] autocmd events の BufWrite/BufWritePre の違い</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/79ab4db8564032de0b25 + TL; DR 違いはない。ただのエイリアス。 +調査記録 Vim の autocmd events には似通った名前のものがいくつかある。大抵は :help に説明があるが、この記事のタイトルにある2つを含めた以下のイベントには、その違いについて説明がない。 + BufRead/BufReadPost BufWrite/BufWritePre BufAdd/BufCreate このうち、BufAdd/BufCreate に関しては、:help BufCreate に + The BufCreate event is for historic reasons. + とあり、おそらくは BufAdd のエイリアスであろうということがわかる。他の2組も同様ではないかと予想されるが、確認のため vim と neovim のソースコードを調査した。 + ソースコードへのリンク vim (調査時点での master branch) neovim (上に同じ) + vim のソースコード 以下は、autocmd events の名前と内部で使われている整数値とのマッピングを定義している箇所である。見ての通り、上でエイリアスではないかと述べた3組には、それぞれ同じ内部値が使われている。 +https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L85-L86 +{"BufAdd", EVENT_BUFADD}, {"BufCreate", EVENT_BUFADD}, https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L95-L97 +{"BufRead", EVENT_BUFREADPOST}, {"BufReadCmd", EVENT_BUFREADCMD}, {"BufReadPost", EVENT_BUFREADPOST}, https://github.com/vim/vim/blob/8e6be34338f13a6a625f19bcef82019c9adc65f2/src/autocmd.c#L103-L105...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/vim-difference-between-autocmd-bufwrite-and-bufwritepre/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> + <h2>[Python] クロージャとUnboundLocalError: local variable 'x' referenced before assignment</h2> + </header> + <section class="entry-content"> + <p>この記事は Qiita から移植してきたものです。 元 URL: https://qiita.com/nsfisis/items/5d733703afcb35bbf399 + 本記事は Python 3.7.6 の動作結果を元にして書かれている。 +Python でクロージャを作ろうと、次のようなコードを書いた。 +def f(): x = 0 def g(): x += 1 g() f() 関数 g から 関数 f のスコープ内で定義された変数 x を参照し、それに 1 を足そうとしている。 これを実行すると x += 1 の箇所でエラーが発生する。 + UnboundLocalError: local variable ‘x’ referenced before assignment + local変数 x が代入前に参照された、とある。これは、f の x を参照するのではなく、新しく別の変数を g 内に作ってしまっているため。 前述のコードを宣言と代入を便宜上分けて書き直すと次のようになる。var を変数宣言のための構文として擬似的に利用している。 +# 注: var は正しい Python の文法ではない。上記参照のこと def f(): var x # f の local変数 'x' を宣言 x = 0 # x に 0 を代入 def g(): # f の内部関数 g を定義 var x # g の local変数 'x' を宣言 # たまたま f にも同じ名前の変数があるが、それとは別の変数 x += 1 # x に 1 を加算 (x = x + 1 の糖衣構文) # 加算する前の値を参照しようとするが、まだ代入されていないためエラー g() 当初の意図を表現するには、次のように書けばよい。...</p> + </section> + <footer class="entry-footer"> + <time>October 2, 2021</time> + </footer> + <a class="entry-link" href="https://nsfisis.github.io/posts/python-unbound-local-error/"></a> +</article> +<article class="post-entry"> + <header class="entry-header"> <h2>PHPerKaigi 2021</h2> </header> <section class="entry-content"> |
