課題 1 のヒント
ヒントです。
すでに提出した人の反応を見ていても、
- add ができるまでが大変。
- add ができれば、sub/and/or は簡単。
- trans-when-stmt は、if のプログラムを理解すれば簡単
ということでしたので、add を解くための誘導をつけます。
さて、trans-add-expr についてやる前に、基本的なリスト操作を復習しましょう。
もし、「整数のリスト」が与えられて、それに対し、
「それぞれの整数値を二乗した値のリスト」がほしかったらどうしたらいいでしょう。
手元には、
(define (square x) (* x x))
という関数が準備してあったとします。
つくるべき関数 square-list は、
- もし、リストが空ならば、空リストを返し、
- もし、リストに要素があれば、
「残りの要素に square-list を施したもの」の先頭に
「先頭要素に square を施したもの」をつなげてやる
ので十分です。
まずは、そんな 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)) を返します。
つまり、
- x や y が来たら、 (ADDWF x 0) などを返し、
- 3 などが来たら、(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