2008年11月8日土曜日

【ANSI-CL】16 例:HTML生成


  • 16.2 HTMLユーティリティ

    • ここのマクロは、マクロとはコードを代わりに書いてくれるもの、という感覚を捉えやすい。

  • 16.3 反復ユーティリティ

    • ユーティリティmap3は頭いいなぁ。こういうのがすいすいかけるようになるとCL使いこなしてるという感じがする。

      (defun map3 (fn lst)
      (labels ((rec (curr prev next left)
      (funcall fn curr prev next)
      (when left
      (rec (car left)
      curr
      (cadr left)
      (cdr left)))))
      (when lst
      (rec (car lst) nil (cadr lst) (cdr lst)))))

      (map3 #'(lambda (&rest args) (princ args))
      '(a b c d))
      ;; (A NIL B)(B A C)(C B D)(D C NIL)
      ;; => NIL

      (map3 #'(lambda (c p n)
      (princ c)
      (if n (princ " | ")))
      '(a b c d))
      ;; A | B | C | D
      ;; => NIL


  • 実践CLでのHTMLの取り扱いは、HTMLタグを表すのにキーワードシンボルを使いつつ、HTML自身をS式で表した上でそれの操作をやっていた。ANSI-CLでの取り扱いは、HTMLタグを書き出す関数やマクロを用意して、それらを使えば何を出力するかはCLで述できるから柔軟でしょ、という方式だ。ANSI-CLの方がライトにいろいろ使える感じで、本腰いれるなら実践CL的な感じかな。

こつこつ。

0 件のコメント: