ELIS復活祭メモ(1) (!(member ...))の謎 — #:g1

Posted 2010-08-10 13:31:00 GMT

もっと時系列に並んだ体系的な記録を書きたいところですが、とりあえず断片的にでも書いてゆきます。
ELISの論文を読んでいたときに、

(!item 2)
(!list (list 1 2 3 4))

(!(member item list) (1+ item)) ;⇒(1 3 3 4)

のようになるのが非常に不思議だったので、これを実機で試してきました!
結果として、実際にこういう風になりました。
Common Lispでも、CARを挟んでやれば、
(LET ((ITEM 2)
      (LIST (LIST 1 2 3 4)))
  (SETF (CAR (MEMBER ITEM LIST))
        (1+ ITEM))
  LIST)
;⇒(1 3 3 4)
となります。
TAOでも、
(!(car (member item list)) (1+ item))
;⇒(1 3 3 4)
という風に同じ結果になりました。
CLでこういう動作を追加する場合、defsetfなどで追加できます。
(DEFSETF MEMBER (ITEM LIST) (VAL)
  `(LISPWORKS:WITH-UNIQUE-NAMES (ITEM LIST VAL)
     (SETF (CAR (MEMBER ,ITEM ,LIST))
           ,VAL))))
これで、
(LET ((ITEM 2)
      (LIST (LIST 1 2 3 4)))
  (SETF (MEMBER ITEM LIST)
        (1+ ITEM))
  LIST)
とも書けます。
恐らくですが、TAO/ELISでも、こういった定義があるのではないかなあと想像しています。

comments powered by Disqus