Hatena::ブログ(Diary)

ふなむしは本の虫 このページをアンテナに追加 RSSフィード

ひま〜じ〜ん! きっと何者にもなれないfu7mu4が告げる!

2014-01-03 ちょっと低い鼻だけが君の特徴で

[] defun の関数名にあたるところに setfが入っている、SETF関数の宣言のメモ

いろいろと、あちらこちらで、Common lispソースコードを見ていると、こんなものに出会った。

(defun (setf car) (new-car lst)
  (rplaca lst new-car)
  new-car)
(defun cookies-out* (&optional (reply *reply*))
"Returns an alist of the outgoing cookies associated with the REPLY object REPLY."
    (cookies-out reply))

(defun (setf cookies-out*) (new-value &optional (reply *reply*))
"Sets the alist of the outgoing cookies associated with the REPLY object REPLY."
    (setf (cookies-out reply) new-value))

defunの関数名のところに、setfが入っている。なんだろう?

いろいろ見ていると、class作成したときの、アクセス関数などで使用される、SETF関数定義だということだった。


実践Common Lisp17.4章にある説明によると、

(defun bank-account ()
   ((customer-name
     :initarg :customer-name
     :initform (error "Must supply a customer name"))
    (balance
     :initarg :balance
     :initform 0)
    (account-number
     :initform (incf *account-numbers*))
    account-type))

こんなクラス定義があったとすると、

SLOT-VALUE関数アクセスできるらしい。

balance スロット*1Reader関数はこうなる。

(defun balance (account)
   (slot-value account 'balance))

それで、このSLOT-VALUE関数を使わない方法としてSETF関数というのがあった。(らしい)

;;; 定義
(defun (setf customer-name) (name account)
   (setf (slot-value account 'customer-name) name))
;;; 使用方法
(setf (customer-name my-account) "fu7mu4") ; name("fu7mu4") を account(my-account)に設定するようになる。

ふふーん。

この書き方の説明のあとで、DEFCLASSの宣言時にアクセサ関数を同時に宣言してしま方法があったので完全に忘れていた。

*1:通常の言葉ではクラスのメンバ

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/fu7mu4/20140103/1388759722
Read the top page of this blog in English (Translated by Google) ここの文章は無断リンク(トラックバック含む)、無断引用可。トラックバックは無断で削除することもあります。 楽しいは楽しいだね、いつでも わかってるよ ちゃんと … うふふ