Parenscript で jQuery を使うのは
ということで以下は不要。
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 件のコメント:
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.
It is wonderful!
Thank you for teaching and Parenscript.
Arigatougozaimasu.
コメントを投稿