Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-09-09

KMRCLを眺める(203) STRUCTURE-SLOT-NAMES

| 13:18 | KMRCLを眺める(203) STRUCTURE-SLOT-NAMES - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(203) STRUCTURE-SLOT-NAMES - わだばLisperになる

今回は、KMRCLのequal.lispからSTRUCTURE-SLOT-NAMESです。

クラスのスロット名を取得するものは眺めましたが、今回は構造体用の物です。

定義は、


(defun structure-slot-names (s-name)
  "Given a STRUCTURE-NAME, returns a list of the slots in the structure."
  #+allegro (class-slot-names s-name)
  #+lispworks (structure:structure-class-slot-names
               (find-class s-name))
  #+(or sbcl cmu) (mapcar #'kmr-mop:slot-definition-name
                          (kmr-mop:class-slots (kmr-mop:find-class s-name)))
  #+scl (mapcar #'kernel:dsd-name
                (kernel:dd-slots
                 (kernel:layout-info
                  (kernel:class-layout (find-class s-name)))))
  #+(and mcl (not openmcl))
  (let* ((sd (gethash s-name ccl::%defstructs%))
               (slots (if sd (ccl::sd-slots sd))))
          (mapcar #'car (if (symbolp (caar slots)) slots (cdr slots))))
  #-(or allegro lispworks cmu sbcl scl (and mcl (not openmcl)))
  (declare (ignore s-name))
  #-(or allegro lispworks cmu sbcl scl (and mcl (not openmcl)))
  (error "structure-slot-names is not defined on this platform")
  )

となっているのですが、#+(or sbcl cmu)では CLASS-SLOT-NAMES と同一の定義です。

動作は、

(DEFSTRUCT FOO X Y Z)

(KL::STRUCTURE-SLOT-NAMES 'FOO)
;⇒ (X Y Z)

しかし、折角定義されているこの関数ですが、どこからも呼ばれていないのが謎です。

CLASS-SLOT-NAMESで間に合ってしまうということなのでしょうか。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100909