課題 1 のヒント


ヒントです。

すでに提出した人の反応を見ていても、

ということでしたので、add を解くための誘導をつけます。
さて、trans-add-expr についてやる前に、基本的なリスト操作を復習しましょう。

もし、「整数のリスト」が与えられて、それに対し、 「それぞれの整数値を二乗した値のリスト」がほしかったらどうしたらいいでしょう。 手元には、

(define (square x) (* x x))
という関数が準備してあったとします。

つくるべき関数 square-list は、

ので十分です。 まずは、そんな square-list をつくってみましょう。
では、trans-add-expr に話を戻しましょう。 trans-add-expr は確に先頭要素だけ特別扱いしなくてはいけないので、 めんどくさいのでこんな感じにしちゃいます。

(define (trans-add-expr expr)
   (cons (load-value (car expr)) ; 先頭要素を mov?? に変換するもの
         (trans-add-expr-aux (cdr expr)))) ; 残りの要素を add?? に変換するもの

trans-add-expr-aux は、(x y 3) などというリストをもらって、 ((ADDWF x 0) (ADDWF y 0) (ADDLW 3)) を返します。 つまり、 という点(*)を除いたら、square-list と変わらないんです。 別の言い方をすると、(*) をみたす関数 trans-add-expr-1 をつくってしまえば、 先ほどつくった square-list の中の、 square という関数を trans-add-expr-1 に、 square-list という名を trans-add-expr-aux に置き換えれば、 できあがりというわけです。
では、頑張ってみてください。

2000.12.5/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp