Advertisement
Shinmera

lQuery Syntax Macro 1.0 -> 2.0 comparison

Aug 8th, 2013
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 3.94 KB | None | 0 0
  1. ;;;;;;;;;; lQuery 1.0.4 macro ;;;;;;;;;;
  2. (defmacro $ (&rest actions)
  3.   `(let ((working-nodes (list *lquery-master-document*)))
  4.      (progn
  5.        ,@(loop for action in actions collect
  6.               `(setf working-nodes
  7.                      ,(if (and (listp action) (not (eq (first action) 'FUNCTION)))
  8.                           (let ((first (car action)))
  9.                             (cond ((dom:node-p first) action)
  10.                                   ((find-symbol (mkstr 'nodefun- first) :lquery)
  11.                                    `(,(find-symbol (mkstr 'nodefun- first) :lquery)
  12.                                       working-nodes
  13.                                       ,@(cdr action)))
  14.                                   (T (loop with name = (mkstr first)
  15.                                         for package in (list :lquery *PACKAGE* :cl)
  16.                                         for symbol = (find-symbol name package)
  17.                                         if symbol
  18.                                         do (return `(,symbol ,@(cdr action)))))))
  19.                           `($-helper ,action :working-nodes working-nodes)))))
  20.      
  21.      working-nodes))
  22.  
  23. (defgeneric $-helper (action &key &allow-other-keys))
  24.  
  25. (defmethod $-helper (action &key)
  26.   action)
  27.  
  28. (defmethod $-helper ((action function) &key working-nodes)
  29.   (funcall action working-nodes))
  30.  
  31. (defmethod $-helper ((action string) &key working-nodes)
  32.   (css:query action working-nodes))
  33.  
  34. (defmethod $-helper ((action dom:node) &key)
  35.   (list action))
  36.  
  37. ;;; SAMPLE OUTPUT ;;;
  38. ;; LQUERY> (macroexpand-1 '($ "aaa" (add-class "test") (children) (remove) #'test test))
  39. ;; (LET ((WORKING-NODES (LIST *LQUERY-MASTER-DOCUMENT*)))
  40. ;;   (PROGN
  41. ;;    (SETF WORKING-NODES ($-HELPER "aaa" :WORKING-NODES WORKING-NODES))
  42. ;;    (SETF WORKING-NODES (NODEFUN-ADD-CLASS WORKING-NODES "test"))
  43. ;;    (SETF WORKING-NODES (NODEFUN-CHILDREN WORKING-NODES))
  44. ;;    (SETF WORKING-NODES (NODEFUN-REMOVE WORKING-NODES))
  45. ;;    (SETF WORKING-NODES ($-HELPER #'TEST :WORKING-NODES WORKING-NODES))
  46. ;;    (SETF WORKING-NODES ($-HELPER TEST :WORKING-NODES WORKING-NODES)))
  47. ;;   WORKING-NODES)
  48.  
  49.  
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. ;;;;;;;;;; lQuery 2.0.0 macro ;;;;;;;;;;
  52.  
  53. (defmacro $2 (&body actions)
  54.   (%$2 (reverse actions)))
  55.  
  56. (defun %$2 (actions)
  57.   (if (zerop (length actions))
  58.       `*lquery-master-document*
  59.       (let ((action (car actions))
  60.             (rest (cdr actions)))
  61.         (determine-argument (%$2 rest) action))))
  62.  
  63. (defgeneric determine-symbol (nodes symbol))
  64. (defgeneric determine-argument (nodes arg))
  65.  
  66. (defmacro define-symbol-handler (type (symbolname nodesname) &body body)
  67.   `(defmethod determine-symbol (,nodesname (,symbolname ,type))
  68.      ,@body))
  69.  
  70. (defmacro define-argument-handler (type (argname nodesname) &body body)
  71.   `(defmethod determine-argument (,nodesname (,argname ,type))
  72.      ,@body))
  73.  
  74. (define-argument-handler list (list nodes)
  75.   (when list
  76.     (let ((function (car list)))
  77.       (if (eq function 'FUNCTION)
  78.         `(,(cadr list) ,nodes)
  79.         (let ((nodefun (find-symbol (format NIL "NODEFUN-~a" function) :lquery)))
  80.           (if nodefun
  81.               (append `(,nodefun ,nodes) (cdr list))
  82.               (append `(,function ,nodes) (cdr list))))))))
  83.    
  84. (define-argument-handler symbol (symbol nodes)
  85.   `(determine-symbol ,nodes ,symbol))
  86.  
  87. (define-argument-handler string (string nodes)
  88.   `(css:query ,string ,nodes))
  89.  
  90. (define-symbol-handler string (selector nodes)
  91.   (css:query selector nodes))
  92.  
  93. (define-symbol-handler T (variable nodes)
  94.   (declare (ignorable nodes))
  95.   variable)
  96.  
  97. (define-symbol-handler dom:node (node nodes)
  98.   (declare (ignorable nodes))
  99.   (list node))
  100.  
  101. ;;; SAMPLE OUTPUT ;;;
  102. ;; LQUERY> (macroexpand-1 '($2 "aaa" (add-class "test") (children) (remove) #'test test))
  103. ;; (DETERMINE-SYMBOL
  104. ;;  (TEST
  105. ;;   (NODEFUN-REMOVE
  106. ;;    (NODEFUN-CHILDREN
  107. ;;     (NODEFUN-ADD-CLASS (QUERY "aaa" *LQUERY-MASTER-DOCUMENT*) "test"))))
  108. ;;  TEST)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement