0

私は、合計手順から始めて、最終的に積まで、スキームデリバティブ計算機が入力をより受け入れられるようにしようとしています。(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))

それは私に悪い構文呼び出しを与えています。そして、私の 2 番目の if は実際には if ステートメントに適合していないように見えますが、それがどのように見えるかの構造は先生から与えられたので、それが機能しないか、または想定されていると混乱します。仕事に行くと思います。

誰かがこれを理解する手を貸してくれるなら、それは素晴らしいことです.

私はこれまでのところ、Scheme にあまり熱中していません。知ったり理解したりするのはクールなことのように思えますが、私の先生はこの 2 週間でそれに合わせようとしていて、私はそれを理解することができません。

4

1 に答える 1

0

したがって、あなたのケースでは、3 つの引数を持つ if-clause があり、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) ...)。たとえば、次のような make-sum 関数を使用できます。

(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))れます。それはあなたが期待したものだと思います。

ところで、あなたはそのプログラムを sicp で手に入れませんでしたか? いいえの場合は、ぜひ試してみてください。スキームとプログラミング全般を学ぶのに最適な本です。http://mitpress.mit.edu/sicp/

于 2012-12-15T17:46:31.630 に答える