anchor.diff:    (labels ((numer (x) (car x))
   	   (denom (x) (cdr x))
   	   (make-rat (n d)
  -	     (let ((g (gcd n d)))
  -	       (cons (/ n g) (/ d g))))
  +	     
  +	     (cons (car (my-reduce n d))
  +		   (cadr (my-reduce n d))))
   	   (add-rat (x y)
  -	     (make-rat (+ (* (numer x) (denom y))
  -			  (* (denom x) (numer y)))
  -		       (* (denom x) (denom y))))
  +	     (make-rat (add (mul (numer x) (denom y))
  +			    (mul (denom x) (numer y)))
  +		       (mul (denom x) (denom y))))
   	   (sub-rat (x y)
  -	     (make-rat (- (* (numer x) (denom y))
  -			  (* (denom x) (numer y)))
  -		       (* (denom x) (denom y))))
  +	     (make-rat (sub (mul (numer x) (denom y))
  +			    (mul (denom x) (numer y)))
  +		       (mul (denom x) (denom y))))
   	   (mul-rat (x y)
  -	     (make-rat (* (numer x) (numer y))
  -		       (* (denom x) (denom y))))
  +	     (make-rat (mul (numer x) (numer y))
  +		       (mul (denom x) (denom y))))
   	   (div-rat (x y)
  -	     (make-rat (* (numer x) (denom y))
  -		       (* (denom x) (numer y))))
  +	     (make-rat (mul (numer x) (denom y))
  +		       (mul (denom x) (numer y))))
   	   (tag (x) (attach-tag 'rational x)))
       (my-put 'add '(rational rational)
   	    #'(lambda (x y) (tag (add-rat x y))))
  
positive.code:      (show l2)
       (show (add-terms l1 l1))
       (show (mul-terms l1 l1))
      
  
       (show (add-terms l2 l2))
       (show (mul-terms l2 l2))
  
       (show (sub-terms l2 l1))
      
  
       (let ((p1 (make-polynomial 'x l1))
  	   (p2 (make-polynomial 'y l2)))
         (show (add p1 p2))
         (show (add p2 (add p1 p2)))
  ;       (show (sub p1 p2))
  ;       (show (mul p1 p2))
         (show p1)
         (show p2))
       (show "test end")
       'done)))
  
  
  ;;;;2.91
  
  (defun div-terms (l1 l2)
    (if (empty-termlist? l1)
        (list (the-empty-termlist) (the-empty-termlist))
        (let ((t1 (first-term l1))
  	    (t2 (first-term l2)))
  	(if (> (order t2) (order t1))
  	    (list (the-empty-termlist) l1)
  	    (let ((new-c (div (coeff t1) (coeff t2)))
  		  (new-o (- (order t1) (order t2))))
  	      (let ((rest-of-result (div-terms (sub-terms l1 
  							  (mul-terms l2
  								     (make-term new-o new-c)))
  					       l2)))
  		(list (add-terms (car rest-of-result) 
  				 (make-term new-o new-c))
  		      (cadr rest-of-result))))))))
  
  ;;;;2.92
  
  
  ;;都写了‘这绝不简单’，先绕过，回头补上。
  ;;写下大体的思路。三种情况需要处理。第一、两个多项式有同一变元。这种情况无需做特别处理。直接相加即可。第二、两个多项式有不同的变元，并且各自的系数中也不存在于另一个相同的变元。这种情况也可以直接相加。第三、就是x的多项式的系数可能是y的多项式。y的多项式的系数是x的多项式。这两个多项式相加就会稍微麻烦一些。首先，要有一个函数来判断这种情况。其次，还要有一个函数来转换其中的一个多项式到另一个多项式。使其具有相同的变元。而题目要求的是要通过加入强制性的变量序来达到目的。需要raise和drop函数来操作这个强制的过程。假定所有的多项式都以x作为变元。drop函数把所有的多项式都转换成为x作为变元的多项式。
  
  ;;难点就在与多项式的转化上。转化之后要变成标准格式的多项式。涉及到按变元次数进行排序的问题。
  
  ;;答案已经写在上面了。思路就是将多项式的每一项分解并逐个检查并变换每一项的变远到x。然后将转换好的每一项再加起来。
  
  
  ;;;;2.93
  
  
  
negative.code: 	    #'(lambda (p1 p2) (tag (mul-poly p1 p2))))
      (my-put 'div '(polynomial polynomial)
  	    #'(lambda (p1 p2) (tag (div-poly p1 p2))))
      (my-put 'gcd '(polynomial polynomial)
  	    #'(lambda (p1 p2) (tag (gcd-poly p1 p2))))
      (my-put 'reduce '(polynomial polynomial)
  	    #'(lambda (p1 p2) (tag (reduce-poly p1 p2))))
      ;;2.87 add =zero?
      (my-put '=zero? '(polynomial) 
  	    #'(lambda (p) (empty-termlist? (term-list p))))
  
      (my-put 'make 'polynomial
  	    #'(lambda (var terms) (tag (make-poly var terms))))
      
      'done))
  
  (install-polynomial-package)
  