EoPL reading (34) 1.3.1 Free and Bound Variables

Exercise.1-26

set! 盛り込め、との事。なんとなく簡単げに考えてるんですが準備を整えて集中。
とりあえず以下な試験を追加して

(test-section "ex.1-26")
(test* "(occurs-free? 'x (set! x 100)) should return #f"
       #f
       (occurs-free? 'x '(set! x 100)))

make してみた。

$ make
Testing let->combination ...                                     passed.
Testing let*->nested-let ...                                     passed.
Testing make-lambda ...                                          passed.
Testing occurs-bound ...                                         passed.
Testing occurs-free ...                                          failed.
discrepancies found.  Errors are:
test (occurs-free? 'x (set! x 100)) should return #f: expects #f => got #t
$

あ、#t が戻るんじゃん、ってか何故に試験パスするのか。

$ make
Testing let->combination ...                                     passed.
Testing let*->nested-let ...                                     passed.
Testing make-lambda ...                                          passed.
Testing occurs-bound ...                                         passed.
Testing occurs-free ...                                          passed.
$

これ、set! も symbol として評価されてるんだろうな。もしかしてこれって実装ゼロで試験が通りそうな気がするので試験をがんがん書いてみます。occurs-free? については以下を追加して試験パス。

(test* "(occurs-free? 'x '(lambda (y) (set! x 100))) should return #t"
       #t
       (occurs-free? 'x '(lambda (y) (set! x 100))))
(test* "(occurs-free? 'x '(lambda (x) (set! x 100))) should return #f"
       #f
       (occurs-free? 'x '(lambda (x) (set! x 100))))

試験足りてなさげですが、同様のナニを occurs-bound? にも追加してみます。

(test-section "ex.1-26")
(test* "(occurs-bound? 'x (set! x 100)) should return #f"
       #f
       (occurs-bound? 'x '(set! x 100)))
(test* "(occurs-bound? 'x '(lambda (y) (set! x 100))) should return #f"
       #f
       (occurs-bound? 'x '(lambda (y) (set! x 100))))
(test* "(occurs-bound? 'x '(lambda (x) (set! x 100))) should return #t"
       #t
       (occurs-bound? 'x '(lambda (x) (set! x 100))))

試験パス。なんか落とし穴があるように思えてなりませんが、とりあえず食器を洗ってコメを仕掛けてきます。

これって

まぢで解が何も盛り込まない、だったら微妙。