>>18
入力はマクロ構文等が全て展開された後のリスト、ということにしておいてください。
lambdaに対応しとけば他に応用もできると思いますので。

これ考えたときはlambdaに渡される引数を与えてquotifyを呼び、
結果をevalだけでα変換できるというのがありでしたが、
unquoteする代わりに直接置換リストを与えても良かったかもしれません。

>>19
たぶんそのsc-expandの名前付け替えと同じことをします。
例えばquotifyの応用で簡単なインライン展開処理が書けると思います。
((lambda (x) ((lambda (y) (+ x y) (proc list)) 1)) 1)なら
((lambda (x) ... ) 1)という並びに注目し (quotify '(x) '((lambda (y) (+ x y) (proc list)) 1)) => `((lambda (y) (+ ,x y) (proc list)) 1)
この結果からさらに
((lambda (y) ... ) 1)という並びに注目し (quotify '(y) '((+ ,x y) (proc list))) => `((+ ,x ,y) (proc list))
という感じでquotifyを再帰的に適用してx=1 y=1の環境でevalすると
((+ 1 1) (proc list))というシーケンスが得られます。
ただしこの変換はxやyが変数や定数の場合に限定されます。
(もしxが呼び出しだったら意味が変わってしまうので。)

>>20
マクロを書け、となるとschemeではややこしくなるので、
ただのリスト変換関数ということにしておいてください。
要は任意のシンボルにタグ付けするということです。


こっちで用意した解答は週末ぐらいに貼り付けます。