There's an echo in my head

日々のメモ。

インタラクティブにRipperで構文解析するIRipperというREPLを作った

github.com

「この記述はRubyにどういうふうに解析されているんだろう!?」という疑問を逐次解決していくためのREPLとして作りました。

lexsexptokenizeというRipperのメソッドを使って、引数で与えられたコードを解析して表示します。

$ iripper
iripper> tokenize 1 + 1
["1", " ", "+", " ", "1"]
iripper> sexp 1 + 1
[:program, [[:binary, [:@int, "1", [1, 0]], :+, [:@int, "1", [1, 4]]]]]
iripper> lex 1 + 1
[[[1, 0], :on_int, "1", EXPR_END|EXPR_ENDARG],
 [[1, 1], :on_sp, " ", EXPR_END|EXPR_ENDARG],
 [[1, 2], :on_op, "+", EXPR_BEG],
 [[1, 3], :on_sp, " ", EXPR_BEG],
 [[1, 4], :on_int, "1", EXPR_END|EXPR_ENDARG]]

「いちいちlexと入力するのが面倒くさい」「ワシはtokenizeにしか興味が無いんじゃ」「S式だけを見ていたい」というように、実行したいメソッド(READMEでは「コマンド」と記載していますが)が決まりきっている場合には、起動引数もしくはdefaultコマンドでデフォルトのメソッドを指定するのが便利でしょう。

$ iripper tokenize
iripper(tokenize)> 1 + 1
["1", " ", "+", " ", "1"]
iripper(tokenize)> default sexp
iripper(sexp)> 1 + 1
[:program, [[:binary, [:@int, "1", [1, 0]], :+, [:@int, "1", [1, 4]]]]]
iripper(sexp)> default
iripper> tokenize 1 + 1
["1", " ", "+", " ", "1"]

例の最後のように、defaultコマンドに何も与えなければデフォルトのメソッド指定を外します。

履歴やカーソル移動などはできません。気が向いたらReadlineなどで対応します。

リズと青い鳥

みた。

liz-bluebird.com

よかった。絵本のストーリーに沿って最初はみぞれが自由な希美を束縛してるのかなと思ってたけど、物語が進むに従ってその立場が逆転して、それに当人たちが気づくという過程は最高だった。その変化を促していく周囲の友人の気配りであるとか、後輩含めた交友の変化とか、そういう周囲の環境が優しい世界だった。本気を出した演奏もよかった。映画館の音響で吹奏楽を聴けるのが嬉しい。Homecomingsのエンディングテーマもどこか懐かしく素晴らしかった。もう上映頻度が下がってしまったけれど、機会があればもう一度見に行きたい。

伝わりにくい個人的みどころ

  • 窓を開ける前後で音の聴こえ方が変わる
  • 岩波文庫

Unityのバッチビルド時にJDK, Android SDK/NDKのパスを切り替える

複数のUnityのバージョンが混在するCI環境を構築していると、バージョン間でAndroid SDKやNDKの要求バージョンが異なるためにビルドスクリプト側でこれらを設定したいということがある。そんなときは次のように記載すればいい。

EditorPrefs.SetString("AndroidSdkRoot", "/path/to/android/sdk");
EditorPrefs.SetString("AndroidNdkRoot", "/path/to/android/ndk");
EditorPrefs.SetString("JdkPath", "/path/to/jdk");

恋は雨上がりのように

みた。

koiame-movie.com

よいおじさん映画だった。店長の家の雰囲気がよかった。あんな書斎のような部屋に住みたい。戸次重幸の役柄との関係性も見ていてよかった。あきらが可愛くて輝いて見えた。これが若さか。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。