2020-10-16
Tech
たまたま時間の都合ができたので、前から気になっていたGo Language Specification輪読会に参加してみた。今回はExpressionsの冒頭を読んだ。
面白かったのは、 if u = User{}; true {
のようにifのあとに中括弧を書くとエラーになるという話。
Goの中括弧はブロックを示す場合と、composite literalを示す場合がある。のだが、上記の場合はどちらなのか決定できない。そのため、ifの直後はパーサが特別なモードになっていて、中括弧は必ずブロックと見なすらしい。その結果、上記は(EBNF上はvalidにもかかわらず)エラーになるというわけ。
ちなみに以下のようにまぎらわしい箇所を括弧でくくってやると通る。
CやJavaScriptではifのあとに括弧が要るからこういう問題は起こらない。Goでは括弧をなくした代わりにパーサが状態を持つようになったというわけ。
Rubyではこういうのが無数にあるんだけど、Goにもあるのが意外で面白かった。
2020-09-30
Diary9月の活動報告です。
今月は季節の変わり目のせいか、あまり調子が出なかった。進捗としては先月やっていたクロージャの実装を終わらせて、今はvtableの実装をしている。これが動けばObject#inspectが実装できる、つまりpメソッドが作れるということでいろいろと楽しくなりそう。
Shiikaについては10月頭の自作プログラミング言語の集いというイベントで発表させてもらうことになった。スライド作らなきゃなあ。
自作キーボード
2020-09-02
Diary8月の活動報告です。
無名関数を実装した。クロージャ(自由変数のキャプチャ)は作業中。先月の日記を見たら「そんなに難しくなさそう」とか書いているが、実際にはすごく大変だった。設計メモがここにある。
何が大変だったかというとクロージャがネストする場合で、各クロージャはllvmのfunctionに変換されるのだが、2つ以上外側のクロージャの変数をキャプチャする場合、真ん中のクロージャも協力して変数をバケツリレーしてやらないといけないのであった。
普段はわりと「書き始めたらなんとかなるだろ」的な感じで見切り発車してしまうのだけど、今回はわりと真面目に考察してみた。そのかいあって実装自体は順調に行っている。
2020-07-31
Diary近況です。
Genericsを導入した。具体的には ary = [1]; ary.first
で 1
が取れるようになった。極めて地味だが、これをちゃんと実現するにはArray<T>
という型が必要なのだ。
次の作業としては無名関数(クロージャ)の実装を予定している。ちょっと考えた限りではそんなに難しくなさそう。
2020-07-28
Tech月報を書くようになって2年以上経つので、メリットだと感じているところをメモしておく。
月報とは
こういうやつ。
自分の趣味プロジェクトについて、その月になにをやったかを毎月まとめている。
2020-07-14
TechVimでRustのLanguage Serverを使う手順。
rlsまたはrust-analyzerを入れる
rlsはrustupでインストールできる。
rustup component add rls rust-analysis rust-src
rust-analyzerはrlsより新しいのだが、まだrustupではインストールできない模様。バイナリ配布があるのでそれをダウンロードしてPATHの通ったところに置く。
2020-07-02
Diary6月の活動報告です。
配列リテラルが動くようになった。いや、動くっていうと語弊があるな…、実はまだObjectのインスタンスしか要素に取れないのだ。今月はIntやStringなど任意のオブジェクトを入れられるようにする。その下準備として、Int/Floatを即値からllvm structに変更した。そうするとInt/Floatもポインタと同じ64bitサイズ(※64bit環境を想定)になるから、配列の要素は全部一個64bitとして扱えばよくて楽なのだ。
ちなみにサイズを64bitに揃える方法としては、llvm structにする以外に「ポインタへの埋め込み」という方法もある。GC_mallocで確保したメモリのアドレスの下2桁が00であると仮定してよいならば、最後を〜01、〜10、〜11のいずれかにすればポインタと衝突しないので、残りの62bitの部分に好きなデータを入れられるのである。
せっかくなので、Boolについてはこの方式を実装してみた。010をfalse、110をtrueとして、メモリ上ではこの値をBoolとして扱う。ただしLLVMの分岐命令などはi1を引数に取るから、適宜i64からi1に変換(box/unbox)してやる。埋め込みの実装は初めてだったけど、テストが通ってるのでちゃんと動いてるっぽい。
2020-06-28
Tech家のMacBookはずっとOSアップグレードをしてなかったのだけど、qmk_firmwareのためにavr-gccを入れようとしたらXCodeが古すぎると言われたので、重い腰を上げてCatalinaにアップグレードした。
以前のアップグレードの際は途中で止まったりして印象が悪かったのだが、今回はすんなり行ってくれた。
ただmakeコマンドを打つと
unable to find utility "make", not a developer tool or in PATH
というエラーが出るようになってしまった。
このへんを見るも原因がよく分からず、App StoreからXCodeのインストールを試したら直った。
2020-06-07
Diary近況です。
インスタンス変数の定義時に、getter/setterを自動で生やすようにした。これによって、以下のようなboilerplateなコードを書かなくて良くなった。
あとは、これを入れるためにいろいろリファクタしたりしていた。
2020-05-17
Techpuma-devを.devで運用していたのだが、最近は.devドメインで提供されるサイトが存在して、実用上困ることになっていた。例えば以下のエントリが閲覧できなかった。
puma-dev -uninstall
で直るかと思ったけど直らず、/etc/resolver/dev というファイルを削除したら直った。