EoPL reading (39) 1.3.1 Free and Bound Variables
何が悪かったのかが判明したので軽くメモを。
動作が微妙だった時に実装の一部が以下。
(else (let g ((rslt rslt) (l l)) (cond ((null? l) rslt) (else (append rslt (list (lexical-address-inner '() dict (car l)))) (g rslt (cdr l)))))
基本的な部分を完全に誤解してたんですが、append で rslt の中身も変わる、って思い込んでました。で、無意識の内に以下なカンジに修正してます。
(else (let g ((rslt rslt) (l l)) (cond ((null? l) rslt) (else (g (append rslt (list (lexical-address-inner '() dict (car l)))) (cdr l)))))
修正して上手く動作するようになった理由に思い至ったのが今日の仕事中 (しかも移動中) だったりして。正直こんなコトで良いのか? と思わざるを得ません。(とほほほ
あと、以下の部分にも手を入れてます。
((symbol? l) (let f ((d 0) (p 0) (dict dict)) (cond ((null? dict) `(,l free)) ((memq l (car dict)) (let f-inner ((p p) (dict (car dict))) (if (eq? l (car dict)) `(,l : ,d ,p) (f-inner (+ p 1) (cdr dict))) )) (else (f (+ d 1) 0 (cdr dict))))))
不具合出てた時の実装が以下。
((symbol? l) (let f ((d 0) (p 0) (dict dict)) (cond ((null? dict) (list `(,l free))) ((memq l (car dict)) (let f-inner ((p p) (dict (car dict))) (if (eq? l (car dict)) (list `(,l : ,d ,p)) (f-inner (+ p 1) (cdr dict))) )) (else (f (+ d 1) 0 (cdr dict))))))
異なっているのは値を戻す時のナニ。ここらへんは出力が微妙だったので手を入れた記憶があります。
しかし_第六感デバッグ_と言ってましたがついに_無意識デバッグ_になっちゃってます。良いのか悪いのかさえも判断不能。