2015-03-05 3 views
1

Чтобы реализовать производную от данного многочлена, мне нужно разложить многочлен, т. е. (* 3 x y) должен быть произведением 3 и (* x y).Пара? функция, применимая к Quote in Racket

Так я реализовал функцию 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.

Может кто-нибудь помочь мне в этом, спасибо большое.

ответ

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

Это именно то, что мне нужно! – stanleyerror

2

Манипулирование символические выражения является то, что match сделано для:

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

 Смежные вопросы

  • Нет связанных вопросов^_^