ホーム  |  製品 & サービス   |  サポート & ダウンロード  |  開発者向け情報  |  お問い合わせ
短編的な Lisp TIPS

まぁ断片的だか短編的だが丹下的だが

テンプレート

テンプレートをつくってコピーする。

(defun make-one-prop (dir-str menu-str content-str title-str &optional html-str)
  (let* ((prop-template
         '(html-path-str page
           ((page :file "libs/common/main-frame-with-menu.who")
            (title title-str)
            (menu-content :file menu-path-str)
            (main-content :file content-path-str))))
         (a-prop (copy-tree prop-template)))
....
      (replace-in-tree a-prop 'html-path-str html-path-str)
      (replace-in-tree a-prop 'menu-path-str menu-path-str)
      (replace-in-tree a-prop 'content-path-str content-path-str)
      (replace-in-tree a-prop 'title-str title-str)

      a-prop))

この例では prop-template がテンプレート。それを copy-tree でコピーしている。let の本文で title-str などを実際の値と入れ替えて a-prop を返す。実際に入れ替えるルーチンは replace-in-tree(後述) 。ここでは copy-tree を使うのがポイント。使わなかった、copy-list などを使うとディープなコピーをしていないので、いろいろ不都合が起きる。(自己書き換え可能な関数ができてしまう!!)

replace-in-tree

テンプレート内のキーワードを指定した値に入れ替える。この手のもともとのリスプになんかありそうだけど、、、

(defun replace-in-tree (tree key-word item)
  (if (null tree) t
    (let ((fist-elm (car tree))
          (remain-tree (cdr tree)))
      (if (atom fist-elm)
        (if (eq fist-elm key-word) (setf (car tree) item))
        (replace-in-tree fist-elm key-word item))
      (replace-in-tree remain-tree key-word item))))