CLでSRFI-100 — #:g1

Posted 2012-02-25 15:52:00 GMT

CLでSRFI、今回は、SRFI-100の「define-lambda-object」です。
謎の大作が多いJoo ChurlSooさんのSRFIですが、SRFI-100は、Jooさんの最新作です。

動作

(defpackage :demo
  (:use :cl :srfi-100 :srfi-89 :named-readtables))

(in-package :demo) (in-readtable :quasiquote)

(define-lambda-object ppoint (x) y)

(define-lambda-object (spoint (ppoint)) (x 0) (y x) (z x) ('stack '()) (`,pop (if (null stack) (error 'spoint "null stack" stack) (let ((s (car stack))) (setq stack (cdr stack)) s))) (,push (lambda (s) (setq stack (cons s stack)))))

(define* sp (make-spoint))

(mapcar #'sp '(x y z)) ;=> (0 0 0) (define* sp (make-spoint 5 55))

(mapcar #'sp '(x y z)) ;=> (5 55 5) (define* sp (make-spoint-by-name 'z 100 'stack (list 'sunflower)))

(mapcar #'sp '(x y z)) ;=> (0 0 100) (funcall (sp 'push) 'rose) ;=> (ROSE SUNFLOWER) (funcall (sp 'push) 'lily) ;=> (LILY ROSE SUNFLOWER) (sp 'pop) ;=> LILY (sp 'pop) ;=> ROSE (sp 'pop) ;=> SUNFLOWER

移植について

リストの作成とは無関係に使われるunquoteがありますが、リードテーブルでquasiquoteをサポートするということにしました。リーダーマクロでサポートしない場合は、unquoteと書いておけば大丈夫な筈です。(ソースからして、quasiquoteを使って書いてあるので使わない場合、修正が必要ですが…)
define-syntaxのものと、define-macroの実装がありますが、define-macroの方を移植してみました。
説明だと(foo :constructor)で帰ってくるのがリストのようですが、コードは点対リストを返すように書かれています。SRFI-100をサポートしているSTklosで確認したところ点対リストが返るので、点対リストで良いやということにしました。
キーワード的なものはいつものごとく利便を考えて、keywordパッケージのシンボルにしてあります。 ■

comments powered by Disqus