我正在尝试使方案衍生产品计算器更接受输入,从总和程序开始,最终产品。我一直在尝试修改程序,以(deriv '(* x y (+ x 3)) 'x)
而不是(deriv '(* x (* y (+ x 3))) 'x)
的形式接受输入。
我正在处理的代码是:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SUM RELATED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;makes a sum structure
(define (make-sum a1 a2)
(list '+ a1 a2))
;checks if something is a sum structure
(define (sum? x)
(and (pair? x)
(eq? (car x) '+)))
;get first term of sum
(define (addend s)
(cadr s))
;get second term of sum
(define (augend s)
(caddr s))
和
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PRODUCT RELATED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;make a product structure
(define (make-product m1 m2)
(list '* m1 m2))
;checks if something is a product structure
(define (product? x)
(and (pair? x)
(eq? (car x) '*)))
;get first factor of product
(define (multiplier p)
(cadr p))
;get second factor of product
(define (multiplicand p)
(caddr p))
我试图解决这个问题,但到目前为止没有太多运气,这是我试图在几个不同的变体中实现的:
;makes a sum structure
(define (make-sum a1 a2)
(if (sum? a1)
(if (sum? a2)
(cons '+ (append (cdr a1) (cdr a2)))
(cons '+ (append (cdr a1) (list a2)))
(cons '+ (append (list a1) (cdr a2)))))
(list '+ a1 a2))
它给了我一个错误的语法调用。而且我可以看到我的第二个如果真的似乎不适合if语句,但我的老师给了我看起来如何看的结构,所以它让我困惑它不起作用,或者假设工作,我想。
如果有人能帮助我理解这一点,那就太好了。
到目前为止,我并不热衷于计划,虽然看起来很难知道或理解,但我的老师正试图在过去两周内适应它,我无法掌握它。
答案 0 :(得分:0)
所以,在你的情况下,你有if子句有3个参数,而它需要2,所以你得到一个错误。如果您想修复您的版本,您应使用此类版本
(define (make-sum a1 a2)
(if (sum? a1)
(if (sum? a2)
(cons '+ (append (cdr a1) (cdr a2)))
(cons '+ (append (cdr a1) (list a2))))
(if (sum? a2)
(cons '+ (append (list a1) (cdr a2)))
(list '+ a1 a2))))
或者,如果你想要更多通用代码,你肯定会使用函数,使用可变数量的参数 - 使用语法(define (func-name . list-of-arguments) ...)
。例如,您可以使用此类生成函数:
(define (make-sum . args)
(cons '+ (apply append (map (lambda (x) (if (sum? x) (cdr x) (list x))) args))))
因此,(make-sum 'a '(+ a b) 'b '(* a b))
将返回'(+ a a b b (* a b))
,猜测这就是您的预期。