2010/08/11

Gauche の and-let* と On Lisp の aand

On Lisp の aand をそのまま scheme で以下のように書いてハマりました。。
(define-macro (aif test-form then-form . else-form)
`(let ((it ,test-form))
(if it ,then-form ,@else-form)))
(define-macro (aand . args)
(cond ((null? args) #t)
((null? (cdr args))(car args))
(else `(aif ,(car args) (aand ,@(cdr args))))))
(aand (string-scan "aaa.el" ".elc" 'after)
(string=? it ""))
;; #<undef>
(macroexpand '(aand (string-scan "aaa.el" ".elc" 'after)
(string=? it "") "not found"))
(let ((it (string-scan "aaa.el" ".elc" 'after)))
(if it
(let ((it (string=? it "")))
(if it
"not found"))))
view raw aand-1.scm hosted with ❤ by GitHub

まともに使うにはこうでしょうか。。
(define-macro (aand . args)
(cond ((null? args))
((null? (cdr args))(car args))
(else `(if-let1 it ,(car args)
(aand ,@(cdr args))
#f))))
(aand (string-scan "aaa.el" ".elc" 'after)
(string=? it ""))
;; #f
view raw aand-2.scm hosted with ❤ by GitHub

というか、gauche を使っているので、and-let* を使った方が無難なようです。。
(and-let* ((it (string-scan "aaa.el" ".elc" 'after))
(it (string=? it "")))
it)
view raw and-let*.scm hosted with ❤ by GitHub


プログラミングGauche

0 件のコメント:

コメントを投稿