2009年1月11日日曜日

【実践CL】13 リストを越えて:コンスセルの別用途


  • 前説

    • 要旨:リストは幻想である。コンスセルから成るものをリストとして扱う関数群がある、というだけだ。
    • 要旨:同様に、コンスセルから成るものを違うものとした扱う関数群もある。木、集合、ルックアップテーブルだ。

  • 13.1 木


      ;; リストとして。
      (substitute 10 1 '(1 2 (3 2 1) ((1 1) (2 2))))
      ;; -> (10 2 (3 2 1) ((1 1) (2 2)))

      ;; 木として。
      (subst 10 1 '(1 2 (3 2 1) ((1 1) (2 2))))
      ;; -> (10 2 (3 2 10) ((10 10) (2 2)))

      なるほど。

  • 13.2 集合

    • 特になし。

  • 13.3 ルックアップテーブル:連想リストと属性リスト

    • あれ? '"a"の動作がわからない、、、。考える。

      • "a"であれば、これはまずreaderが文字列オブジェクトを生成する。それをevaluatorが評価する。評価した結果は同じ文字列オブジェクトである。それをprinterがR/W eqivalenceで印字する。それが"a"である。
      • '"a"の場合。分析の記述を簡単にするために、(quote "a")であるとする。これはまずreaderがLispフォームを生成するのだが、それはリストであり、第一要素はシンボルquoteである。第二要素は、文字列オブジェクトである。このリストをevaluatorが評価する。評価にあたり、quoteはスペシャルフォームであり、その引数位置にあるLispオブジェクトを評価せずにそのまま返却する。よって文字列オブジェクトである。それをprinterがR/W eqivalenceで印字する。それが"a"である。

    • ふむ。あたりまえのことだった。
    • getfは常にeqで比較。
    • 本のremfは例が悪い。次の例が簡明。

      CL-USER(32): *plist*
      NIL
      CL-USER(33): (setf (getf *plist* :a) 2)
      2
      CL-USER(34): (setf (getf *plist* :b) 3)
      3
      CL-USER(35): *plist*
      (:B 3 :A 2)
      CL-USER(38): (remf *plist* :a)
      T
      CL-USER(39): *plist*
      (:B 3)
      CL-USER(40):

    • get-propertiesも中途半端な例だな。簡明な例は次のとおり。

      CL-USER(47): *plist*
      (:C 0 :B 3 :A 2)
      CL-USER(48): (get-properties *plist* '(:a :b))
      :B
      3
      (:B 3 :A 2)
      CL-USER(49):


  • 13.4 DESTRUCTURING-BIND

    • 特になし。


こつこつ。

0 件のコメント: