#:g1: 定番メソッドコンビネーション紹介: list

Posted 2018-12-08 08:45:11 GMT

Lisp メソッドコンビネーション Advent Calendar 2018 8日目 》

今回はCommon Lispの組み込みメソッドコンビネーションのlistを紹介していきます。

listメソッドコンビネーション

listは、メソッドの集合をlistで囲んだように実行するもので、全体の結果がリストとして返ってきます。

(defgeneric foo (x)
  (:method-combination list))

(defmethod foo list ((x number)) (cons x 'number))

(defmethod foo list ((x rational)) (cons x 'rational))

(defmethod foo list ((x float)) (cons x 'float))

(defmethod foo list ((x integer)) (cons x 'integer))

(foo 1)((1 integer) (1 rational) (1 number))

こんなのどこで使うんだと思ってしまいますが、あれこれ考える中で、返り値がリストということは、:aroundで色々変形してやれば、結構汎用的な使い方もできることに気付きました。

多値で返す

(defmethod foo :around (x)
  (values-list (call-next-method)))

(foo 1)(1 integer) (1 rational) (1 number)

任意の集約

(defmethod foo :around (x)
  (reduce (lambda (x ans)
            `(,(+ (car x) (car ans))
              ,(cons (cadr x) (cadr ans))))
          (call-next-method)
          :initial-value '(0 nil)
          :from-end T))

(foo 1)(3 (integer rational number))

標準の組み込みメソッドコンビネーションで結果を集約する関数系のものに、+minmaxappendnconcがありますが、これ等は、list+:aroundで集約で実現できてしまいそうです。

自ら今後紹介するメソッドコンビネーションのネタを潰してしまった感もありますが、次回も、標準組み込みのメソッドコンビネーションを紹介したりしようかなと思います。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus