对?函数应用于Racket中的Quote

时间:2015-03-05 16:34:33

标签: scheme racket quote sicp

为了实现给定多项式的导数,我需要对多项式进行分解,即(* 3 x y)应该是3(* x y)的乘积。

所以我实现了一个函数multiplicand来获得产品的第二个因素:

(define (multiplicand p) 
  (let ((second-factor (cdr (cdr p))))
  (if (pair? second-factor) (cons '* second-factor)
   second-factor)))

,测试代码是

(multiplicand '(* x y))

但输出为'(* y)。似乎条件(pair? second-factor)等于#true second-factor'y

任何人都可以帮助我,非常感谢。

2 个答案:

答案 0 :(得分:3)

请记住(cdr (cdr ...))正在返回一个列表(不是元素!),因此如果列表中有足够的元素(三个或更多),pair?将返回true。也许你的目标是这样的?

(define (multiplicand p) 
  (if (null? (cdddr p)) ; assuming list has at least 3 elements
      p
      `(* ,(second p) (* ,(third p) ,(fourth p)))))

(multiplicand '(* x y))
 => (* x y)

(multiplicand '(* 3 x y))
 => (* 3 (* x y))

答案 1 :(得分:2)

操纵符号表达式是match的用途:

(define (multiplicand p)
  (match p
     [(list '* m n) n]
     [_ (error 'multiplicand (~a "expected product, got: " p))]))