練習

与えられた木から、子→親への対応を作る
CommonLispで書いてみる。

(defvar *tree*
  '(Root (Spine (Neck (Head))
                (RClavicle (RUpperArm (RLowerArm (RHand))))
                (LClavicle (LUpperArm (LLowerArm (LHand)))))
         (RHip (RUpperLeg (RLowerLeg (RFoot))))
         (LHip (LUpperLeg (LLowerLeg (LFoot))))))

(defun tree->alist (l)
  (let (result)
    (labels ((itr (parent children)
               (dolist (child children)
                 (when (cdr child)
                   (itr (car child) (cdr child)))
                 (push (cons (car child) parent) result))))
      (itr (car l) (cdr l)))
    result))

実行

* (tree->alist *tree*)

((LHIP . ROOT) (LUPPERLEG . LHIP) (LLOWERLEG . LUPPERLEG) (LFOOT . LLOWERLEG)
 (RHIP . ROOT) (RUPPERLEG . RHIP) (RLOWERLEG . RUPPERLEG) (RFOOT . RLOWERLEG)
 (SPINE . ROOT) (LCLAVICLE . SPINE) (LUPPERARM . LCLAVICLE)
 (LLOWERARM . LUPPERARM) (LHAND . LLOWERARM) (RCLAVICLE . SPINE)
 (RUPPERARM . RCLAVICLE) (RLOWERARM . RUPPERARM) (RHAND . RLOWERARM)
 (NECK . SPINE) (HEAD . NECK))

ProjectEulerのおかげかこれは5分以内に書けたけど、一昨日あったCL勉強会はROMってみたものの殆ど意味が分からなかったorz
賢くなったといえばdefparameterを覚えたことくらいか。もっと勉強しよう。

話を戻して。
上の問題の回答例を見てみると、殆ど自分と同じことやってそうな人がいることはわかるんだけど、その他の人のコードが全然読めない。
Shiroさんのカッコよさげな模範解答もよく分からなくて悲しい。

Gauche本読もうかしら。
でもまだANSICommonLispもOnLispも1/3くらいしか読み進めてないんだよな…

loop

loopが嫌われてるという話。
上のコードなんか再帰とループマクロ両方使っちゃってるけどどうなんだろう。
理由をまったく知らないので今度調べる。