/var/log/messages

debugging with sixth sense

EoPL の Exercise 2.16

list-find-position 使え、ということであれば

  • list-find-position が #f を戻す場合、その場所から以降末端まで sym は無い
  • 最初の呼び出しで #f が戻ったら #f で良い
  • list-find-position の戻りが number? な場合は位置を覚えといて再度 list-find-position すりゃ良いのかどうか

む、見つかった位置以降、じゃないと無駄だな。以下な定義として

(define list-find-last-position
  (lambda (sym los)

内部手続きの定義を含めて初期化は以下?

    (let inner ((ret #f) (pos (list-find-position sym los)))
      (cond ((eqv? #f pos) ret)
            (else
              (inner pos (list-find-position sym (list-tail los pos))))))))

なんか全部書いてしまったんだけどこれ、動くのかな。list-tail なあたりが微妙。こうかな。

    (let inner ((ret #f) (pos (list-find-position sym los)) (l los))
      (cond ((eqv? #f pos) ret)
            (else
              (inner pos (list-find-position sym (list-tail l pos)) (list-tail l pos)))))))

む、こうしたい。

    (let inner ((ret #f) (pos (list-find-position sym los)) (l los))
      (let ((tail-list (list-tail l pos)))
        (cond ((eqv? #f pos) ret)
              (else
                (inner pos (list-find-position sym tail-list)) tail-list))))))

とりあえず

以下な試験をでっちあげてみました。

上記実装盛り込んでみたのですがループしてますorz なんかややこしいのでもっかいイチから考えることにします。ばたばたしてると微妙。今日はこれからやらねば、なことを集中してやります。

通勤中に気になったので

実装でっちあげてしまいました。一応いくつか追加した試験にもパスしてる模様。

(define list-tail
  (lambda (l pos)
    (let inner ((l l) (pos (+ pos 1)))
      (if (eq? 0 pos)
          l
          (inner (cdr l) (- pos 1))))))

(define list-find-last-position
  (lambda (sym los)
    (let ((pos (list-find-position sym los)))
      (if (not pos)
          pos
          (let inner ((pos pos) (l (list-tail los pos)))
            (let ((newpos (list-find-position sym l)))
              (if (not newpos)
                  pos
                  (inner (+ 1 pos newpos) (list-tail l newpos)))))))))

Comments