2009/10/17

Parenscript で jQuery を使うのは

chain を使いましょう。

ということで以下は不要。

Common Lisp で JavaScript が書ける Parenscript はすばらしい。でも Parenscript で jQuery を使うのはとてもめんどくさい。例えば $('#f1').attr('action', 'edit') は

(ps:ps (ps:@ ((ps:@ ($ "#f1") attr) "action" "edit")))
のようになる。メソッドをつなげていくのが不得手なの。 Lisp らしいシンタックスではあるが、これでは書く気にならない。

というわけで定番の「マクロを使えば」となる。

(js (-> $ ("#f1") attr ("action" "edit")))
これなら Parenscript で書く気になるよね。
(defmacro js (&body form)
`(ps:ps ,@(mapcar #'parse-js form)))

(defun ->p (x)
(and (symbolp x)
(string= "->" (symbol-name x))))

(defun parse-js (form)
(cond ((atom form)
form)
((->p (car form))
(-> (cddr form) (cadr form)))
(t
(mapcar #'parse-js form))))

(defun -> (form acc)
(cond ((null form)
acc)
((listp (car form))
(-> (cdr form) (if (->p (caar form))
`(,acc ,(parse-js (car form)))
`(,acc ,@(parse-js (car form))))))
(t
(-> (cdr form) `(ps:@ ,acc ,(car form))))))

2 件のコメント:

Vladimir Sedach さんのコメント...

Hello Tahara-san!

There is already the CHAIN macro in Parenscript that does the same thing:

(ps (chain ($ "#f1") (attr "action" "edit")))

=> "$('#f1').attr('action', 'edit');"

I need to update the documentation to describe CHAIN.

Yoshinori Tahara さんのコメント...

It is wonderful!
Thank you for teaching and Parenscript.
Arigatougozaimasu.