为了实现给定多项式的导数,我需要对多项式进行分解,即(* 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
。
任何人都可以帮助我,非常感谢。
答案 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))]))