2008/07/12

[Common Lisp] L-99 の P01 のために SERIES を拡張してみた

L-99 の P01 のために SERIES を拡張してみた。

g000001 さんが楽しんでらっしゃる L-99 を SERIES でやってみようかな、と思ったらさっそく一問目からつまずいた。

最後の要素をとってくる collect-last はあっても、最後のセルをとってくる関数がみあたらない。しかたないので collect-last-cons を作ってみた。でも、よくわかっていない。

fragl(どういう意味だろう?)手強い。

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :series))

(in-package :series)

(eval-when (:compile-toplevel :load-toplevel :execute)
(install))

(defS collect-last-cons (items)
"P01"
(fragl ((items t)) ; args
((cons)) ; rets
((cons list nil)) ; aux
() ; alt
() ; prolog
() ; body
((setq cons (list items))) ; epilog
() ; wraprs
nil) ; ?
:trigger t)

(assert (equal '(d)
(collect-last-cons #z(a b c d))))

;; 展開するとこうなる。なので新しい cons を返してしまっている。
(pprint (macroexpand-1 '(collect-last-cons #z(a b c d))))
;; (COMMON-LISP:LET* ((#:LISTPTR-842 '(A B C D)) #:ELEMENTS-843)
;; (DECLARE (TYPE LIST #:LISTPTR-842))
;; (TAGBODY
;; #:LL-844
;; (IF (ENDP #:LISTPTR-842) (GO END))
;; (SETQ #:ELEMENTS-843 (CAR #:LISTPTR-842))
;; (SETQ #:LISTPTR-842 (CDR #:LISTPTR-842))
;; (GO #:LL-844)
;; END)
;; (LIST #:ELEMENTS-843))

0 件のコメント: