Lisp在科学工作中的运用-2.1 定义各类宏

待完成

(defun replace-symbolA-with-symbolB-in-term (term0 test-lambda replace-lambda nil-lambda)
  (declare (optimize (safety 0) (speed 3)))
  (multiple-value-bind (rest-term find-term)   (cut-term test-lambda term0)
    (if find-term
        (c** (c-number term0) rest-term (funcall replace-lambda find-term))      
        (c** (c-number term0) rest-term (funcall nil-lambda)) )))
(defun replace-termA-with-termB-in-terms (terms0 test-lambda replace-lambda nil-lambda)
  (declare (optimize (safety 0) (speed 3)))
  (let ((new-terms (make-instance 'c-terms)))
    (dolist (b-term (term-list terms0))
      (setf new-terms (c+$ new-terms (replace-symbolA-with-symbolB-in-term b-term test-lambda replace-lambda nil-lambda))))
     (s new-terms)))
(defun cut-term-with-number (test-lambda term0)
  (declare (optimize (safety 0) (speed 3)))
 (let ((find-term nil) (rest-term nil))
   (dolist (symbol-a  (symbol-list (dup-term term0)))
     (if find-term (setf rest-term (append rest-term (list symbol-a)))
       (if (funcall test-lambda symbol-a) 
          (setf find-term symbol-a)
          (setf rest-term (append rest-term (list symbol-a)))
          ) ) )
   (values (c* (cc-number term0) (make-instance 'c-term :symbol-list rest-term )) find-term)
 ))
(defmacro define-operator (name1 &optional (other-name1 'non-use-othername))
  (let ((test-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-test-lambda")))))
        (replace-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-replace-lambda")))))
        (nil-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-nil-lambda"))))))
    `(progn
       (defmethod ,name1 ((vector-a c-vector))
         (declare (optimize (safety 0) (speed 3)))
         (c* 1 (funcall ,replace-lambda-name vector-a)) )
       (defmethod ,name1 ((term-a c-term))
         (declare (optimize (safety 0) (speed 3)))
         (let ((test-lambda ,test-lambda-name) 
               (replace-lambda ,replace-lambda-name)
               (nil-lambda ,nil-lambda-name)) 
           (replace-symbolA-with-symbolB-in-term term-a test-lambda replace-lambda nil-lambda)
           ))
       (defmethod ,name1 ((terms-a c-terms))
         (declare (optimize (safety 0) (speed 3)))
         (let ((test-lambda ,test-lambda-name) 
               (replace-lambda ,replace-lambda-name)
               (nil-lambda ,nil-lambda-name)) 
           (replace-termA-with-termB-in-terms terms-a test-lambda replace-lambda nil-lambda)
           ))
       (defmethod ,name1 ((terms-a (eql nil)))
         nil)
       (defun ,other-name1 (parameter1)
         (,name1 parameter1)))
    ))
(defmacro define-operator-func (name1 &optional (other-name1 'non-use-othername))
  (let ((test-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-test-lambda")))))
        (replace-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-replace-lambda")))))
        (nil-lambda-name (funcall (intern (string-upcase (concatenate 'string (symbol-name name1) "-nil-lambda"))))))
    `(progn
       (defmethod ,name1 ((func-a c-func))
         (declare (optimize (safety 0) (speed 3)))
         (c* 1 (funcall ,replace-lambda-name func-a)) )
       (defmethod ,name1 ((term-a c-term))
         (declare (optimize (safety 0) (speed 3)))
         (let ((test-lambda ,test-lambda-name) 
               (replace-lambda ,replace-lambda-name)
               (nil-lambda ,nil-lambda-name)) 
           (replace-symbolA-with-symbolB-in-term term-a test-lambda replace-lambda nil-lambda)
           ))
       (defmethod ,name1 ((terms-a c-terms))
         (declare (optimize (safety 0) (speed 3)))
         (let ((test-lambda ,test-lambda-name) 
               (replace-lambda ,replace-lambda-name)
               (nil-lambda ,nil-lambda-name)) 
           (replace-termA-with-termB-in-terms terms-a test-lambda replace-lambda nil-lambda)
           ))
       (defmethod ,name1 ((terms-a (eql nil)))
         nil)
       (defun ,other-name1 (parameter1)
         (,name1 parameter1)))
    ))
;--------
(defmacro define-use-saved (name1)
  (let ((real-func-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-real"))))
        (init-zero-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-init-zero"))))
        (show-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-show"))))
        ) ;ref!!!! from onlisp
    `(let ((saved-result-list nil))
         (defmethod ,name1 ((c1 c-vector) (c2 c-vector))
           (declare (optimize (safety 0) (speed 3)))
           (let ((result nil))
             (block stop1
               (dolist (result-tuple saved-result-list)
                 (if (and (symbol=? c1 (first result-tuple)) (symbol=? c2 (second result-tuple)))
                   (progn (setf result (third result-tuple))
                     (return-from stop1))))
               (setf result (s (,real-func-name c1 c2)))
               (setf saved-result-list (append saved-result-list (list (list c1 c2 (dup-terms  result)))))
               )
             result))
       (defun ,init-zero-name  ()
           (setf saved-result-list nil))
       (defun ,show-name  ()
           (dolist (c3 saved-result-list)
             (print-c (first c3)) (print-c (second c3)) (print-c (third c3)) (princ " -- "))
         )
    )))  
(defmacro define-use-saved-with-r (name1)
  (let ((real-func-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-real"))))
        (init-zero-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-init-zero"))))
        (show-name  (intern (string-upcase (concatenate 'string (symbol-name name1) "-show"))))
        )
    `(let ((saved-result-list nil))
         (defmethod ,name1 ((c1 c-term) (c2 c-term))
           (declare (optimize (safety 0) (speed 3)))
           (let ((result nil))
             (multiple-value-bind (c1-rest c1-r c1-vec) (Pick-Ynm-and-R c1)
               (multiple-value-bind (c2-rest c2-r c2-vec) (Pick-Ynm-and-R c2)
                 (block stop1
                   (dolist (result-tuple saved-result-list)
                     (if (and (symbol=? c1-vec (first result-tuple)) (symbol=? c2-vec (second result-tuple))
                              (symbol=? c1-r (third result-tuple)) (symbol=? c2-r (fourth result-tuple)))
                         (progn (setf result (fifth result-tuple))
                           (return-from stop1))))
                   (setf result (s (,real-func-name (c* c1-r c1-vec) (c* c2-r c2-vec))))
                   (setf saved-result-list (append saved-result-list 
                                                   (list (list c1-vec c2-vec c1-r c2-r (dup-terms  result))))))
             (c*. c1-rest c2-rest result)))))
       (defun ,init-zero-name  ()
           (setf saved-result-list nil))
       (defun ,show-name  ()
           (dolist (c3 saved-result-list)
             (print-c (first c3)) (print-c (second c3)) (print-c (third c3)) (princ " -- "))))))    
;---
(defun look-up-pos-in-beans (vector-list vector1 l1)
  (block here1
    (dotimes (i l1)
      (if (symbol=? (aref vector-list i) vector1) (return-from here1 i) )
      )
    -1
    ))
(defun vector-or-r (v1)
  (if (null v1) (make-num 1)
    v1))
(defmacro rip-beans-vector-poly (c1 vector-list poly-list l1)
  `(dolist (c1a (term-list ,c1))
     (let ((pos1 -1))
       (multiple-value-bind (poly1 vector1) (cut-term-with-number #'(lambda (s1) (eq (type-of s1) 'c-vector)) c1a)
         (setf pos1 (look-up-pos-in-beans ,vector-list  (vector-or-r vector1) ,l1))        
         (if (= pos1 -1) (setf pos1 ,l1 ,l1 (+ 1 ,l1) (aref ,vector-list pos1) (dup-symbol (vector-or-r vector1))) )
           (setf (aref ,poly-list pos1)  (c+ (aref ,poly-list pos1) poly1)) 
         ) ) ) )
               
(defmacro insert-to-beans (v1 t1 vector-list poly-list l1)
  `(dolist (c1a (term-list ,v1))
     (let ((pos1 -1))
       (multiple-value-bind (poly1 vector1) (cut-term-with-number #'(lambda (s1) (eq (type-of s1) 'c-vector)) c1a)
         (setf pos1 (look-up-pos-in-beans ,vector-list (vector-or-r vector1) ,l1))
         (if (= pos1 -1) (setf pos1 ,l1 ,l1 (+ 1 ,l1) (aref ,vector-list pos1) (dup-symbol (vector-or-r vector1)) ))
         (setf (aref ,poly-list pos1)  (c+ (aref ,poly-list pos1) (c* poly1 ,t1   )) )
         ) ) ) )
;;--------
;(defmacro Div (&body parameter1)
;  `(Div-U ,@parameter1))
;;-----Conjugate-vec
(defmacro conj-v (&body parameter1)
   `(Conjugate-vec ,@parameter1))
(defmacro Walk-terms (&body parameter1)
  `(Walk-Through-terms-in-*-r2->beans-BC ,@parameter1))
(defmacro c-base-l (&body parameter1)
  `(construct-layer-base-list ,@parameter1))
(defmacro c-trial-l (&body parameter1)
  `(construct-layer-trial-list ,@parameter1))
;;---
(defun replace-old-new (tree1 var-old var-new)
  (let ((word1 tree1))
    (dotimes (i (length var-old))
      (if (eq word1 (nth i var-old)) (setf word1 (aref var-new i))) )
    word1
    ))   
(defun tree-var-substitue (tree1 var-old var-new)
  (cond ((null tree1) nil)
        ((atom tree1) (replace-old-new tree1 var-old var-new))
        (t (append (list (tree-var-substitue (first tree1)  var-old var-new))
                   (tree-var-substitue (rest tree1) var-old var-new)))) )   
(defmacro Operators[A]->[Ai] (var-list1 &body body1)
  (let* ((len1 (length var-list1))
         (var-array (make-array (list len1)))
         (new-body nil) )
    (dotimes (i len1)
      (setf (aref var-array i) (gensym)) )
    (setf new-body (tree-var-substitue body1 var-list1 var-array))
    (dotimes (i len1)
      (if (= 0 i) (setf new-body `(dolist (,(aref var-array i) (term-list ,(nth i var-list1)) )
                        ,@new-body))
          (setf new-body `(dolist (,(aref var-array i) (term-list ,(nth i var-list1)) )
                            ,new-body
                            ) ) ))
    new-body
    ))
;---
(defmacro Terms[op]Terms->Term[op]Term (name1)
  (let ((op-name  (intern (string-upcase (symbol-name name1) )))) 
    ;; c+ or c+$ ?
    `(defmethod ,op-name ((c1 c-terms) (c2 c-terms))
       (declare (optimize (safety 0) (speed 3)))
       (let ((new-terms (make-instance 'c-terms)))
         (dolist (b-term (term-list  c1))
           (dolist (a-term (term-list  c2))
             (setf  new-terms (c+ new-terms (,op-name (dup-term b-term) (dup-term a-term)))))) 
        (s new-terms)))
    ))
(defmacro Term[op]Term->Vec[op]Vec (name1)
  (let ((op-name  (intern (string-upcase (symbol-name name1) )))) 
    `(defmethod ,op-name ((term-a c-term) (term-b c-term))
       (declare (optimize (safety 0) (speed 3)))
       (multiple-value-bind (rest-term-a find-term-a)   (cut-term-with-number (dot-test-lambda) (dup-term term-a))
         (multiple-value-bind (rest-term-b find-term-b)   (cut-term-with-number (dot-test-lambda) (dup-term term-b))
           (c** rest-term-a rest-term-b (,op-name find-term-a find-term-b)))) ) ))
;--
(defmacro clean-coeff-list-in-bean (c1)
  (let ((i (gensym)) (j (gensym)) (k (gensym)))
    `(dotimes (.i 4)
       (dotimes (,j 100)
         (dotimes (,k 40)
           (setf (coeff-list (aref ,c1 ,i ,j ,k)) nil))))))
;-
(defmacro aref-beanpod-r (bean1 r-order1)
  `(aref (r-beanpod ,bean1) ,r-order1) )
(defmacro add-coeff->Bean (left-right-pod Ynm2 rest-term3 r2)
  `(let ((pos1 -1))
     (dolist (bean1 ,left-right-pod)
       (if (and (= (i bean1) (Y-R-S-T->0123 ,Ynm2)) (= (j bean1) (vect->ind ,Ynm2)))
           (setf (coeff-list (aref-beanpod-r bean1 ,r2))
                 (c+ (coeff-list (aref-beanpod-r bean1 ,r2))
                     ,rest-term3) pos1 1))  )
     (if (= -1 pos1) 
         (let ((beanpod1 (make-instance 'c-Xnm-bean :i (Y-R-S-T->0123 ,Ynm2) :j (vect->ind ,Ynm2))))
           (dotimes (illl *bean-r-max*)
             (setf (aref-beanpod-r beanpod1 illl) (make-instance 'c-r-bean )))
           (setf (coeff-list (aref-beanpod-r beanpod1 ,r2)) (*->terms ,rest-term3)) 
           (setf ,left-right-pod (append ,left-right-pod (list (copy-instance beanpod1))))))))


转载于:https://my.oschina.net/ijitai/blog/609811

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值