きりかノート 3冊め

おあそびプログラミング

clang trunkの新しいリテラル (2) - 各界の反応

clang trunkの新しいリテラルのつづき。
特に継続的に追っかけるつもりとかはないのですが、気付いた範囲で。

あといちおう書いておくけれど、これらの新しい記法によって従来の書きかたが使えなくなったりはしていません。単なるシンタックスシュガーです。

公式のドキュメント公開される

clang.llvm.orgにて"Objective-C Literals"と題したドキュメントが公開されました。仕事はやい!

Discussionのところがおもしろくって、

  • @INT_MAX はNSNumberになるけど、@INT_MIN はならない。
  • obj[idx] += 1; とかは書けないよ。(ここは構文の話だけど、そもそも値がid型なので演算子オーバーロードができないとムリ)

あたりが個人的にはヒット。

Availability Checksのところは、マクロで新しいリテラル・subscriptingが有効かどうかが判定できるよ、って話なんですが、気にしなきゃいけない状況なら旧スタイルで書きますよね。

NSArrayやNSDictionaryでないクラスでもsubscripting

先日も追記で書いた、Big Nerd Ranch Weblogの記事 "Objective-C Literals, part 2" をちょっと解説しときます。

前述の公式ドキュメントにもあるように、特定のメソッドさえあれば、ary[idx]やdict[key]といった形式で値を取り出したり、値をセットすることができます。そこで

  • 負のインデックスを受け付ける(-1で最後の要素を返す)Arrayのクラスをつくってみたり
  • Dictionaryを階層化し@"path/to/key"で、dict[path][to][key]にアクセスするようなクラスをつくってみたり

というサンプルが載っています。コードだけならgistにのってるほうのが見やすいですかね。

MLの議論が続く

基本的に議論はclangのcfe-devではなく、appleのobjc-languageのほうが中心のようです。ざっと今週分を読んでみたんですが、わりとどうでもいいというか、なんか気が滅入るカンジなので1つだけ。

話題のなかで以前のメールがあげられてたんですが、そこでNSSetのリテラルが作られなかった理由が書かれています。

We measured container usage across Apple's code, and it was something
like 95% NSArray/NSDictionary, 5% NSSet.

そういえば自分もあんまし使わないですね、NSSet