Objective-C ( というより C ) を書くのが面倒すぎる

例えば、今コーディングしている状況はですね、次のような user defaults があって

Root:
  PaletteWindows:
    - PaletteNames:
        - Inspector
        - Navigator

パレットウィンドウがいくつかあって、そのウィンドウの中にまたいくつかパレットが入っている、photoshop のようなものを考えてもらうといいです。これを読みこんでパレットを組み立てる。
Objective-C で書くと、まあこんな感じになりますよ。

- (void)setupPalettesFromUserDefaults:(NSUserDefaults *)defaults {
  NSArray *paletteWindowInfo = [defaults arrayForKey:"PaletteWindows"];
  if (!paletteWindowInfo) return;
  NSEnumerator *enumerator = [paletteWindowInfo objectEnumerator];
  NSDictionary *info;
  while (info = [enumerator nextObject]) {
    NSArray *paletteNames = [info objectForKey:"PaletteNames"];
    if (!paletteNames) continue;
    NSMutableArray *palettes = [NSMutableArray arrayWithCapacity:paletteNames count]];
    NSEnumerator *paletteNameEnumerator = [paletteNames objectEnumerator];
    NSString *paletteName;
    while (paletteName = [paletteNameEnumerator nextObject]) {
      PaletteController *palette = [PaletteController sharedPaletteControllerNamed:aletteName];
      if (!palette) continue;
      [palettes addObject:alette];
    }
    if (![palettes count]) continue;
    PaletteWindowController *paletteWindowController = [[[PaletteWindowController alloc] init] autorelease];
    NSEnumerator *paletteEnumerator = [palettes objectEnumerator];
    PaletteController *palette;
    while (palette = [paletteEnumerator nextObject]) {
      [paletteWindowController addPalette:palette];
    }
    [self addPaletteWindowController paletteWindowController];
  }
}

めんどい。Ruby で書けばこのくらいになる。

def setupPalettesFromUserDefaults(defaults)
  (defaults['PaletteWindows'] || []).each do |info|
    palettes = (info['PaletteNames'] || []).map {|name| PaletteController.sharedPaletteController(name) }.compact
    next if palettes.size
    paletteWindowController = PaletteWindowController.new
    palettes.each {|palette| palettewindowcontroller.addPalette(palette) }
    addPaletteWindowController(paletteWindowController)
  end
end

fast enumeration なら多少よくなるけど、OS 10.5 以上でしか動かないのでは使えないし。まいったね。Objective-C++ で boost::lambda とかはどうかな...うごくのかな...