/var/log/messages

debugging with sixth sense

EoPL の Exercise 2.24

2.1.2 の subst あたりを復習。subst の定義が以下。

(define subst
  (lambda (new old slist)
    (if (null? slist)
        '()
        (cons
          (subst-in-symbol-expression new old (car slist))
          (subst new old (cdr subst))))))

あるいは subst-in-symbol-expression の定義が以下。

(define subst-in-symbol-expression
  (lambda (new old se)
    (if (symbol? se)
        (if (eqv? se old) new se)
        (subst new old se))))

あと、Ex.2.13 の term の定義が以下。

(define-datatype term term?
  (var-term
    (id symbol?))
  (constant-term
    (datum constant?))
  (app-term
    (terms (list-of term?))))

これらを踏まえて

  • (empty-subst)
  • (apply-subst s i)
  • (extend-subst i t s)

を、とのこと。2.3.2 な Procedural なソレと 2.3.3 な Abstract なソレをとあります。

Procedural Representation

時間が無い。ちょっとだけ。こちらは

  • extend-subst と empty-subst は手続きを戻す
  • apply-subst は手続きを apply するのみ

ということは apply-subst は以下になるはず。

(define apply-subst
  (lambda (s i)
    (s i)))

empty は時間無いので略。extend の中身がどうなるか。

(define extend-subst
  (lambda (i t s)
    (lambda (sym)

む、これって sym と i が eqv? なら置換、なのか。以下?

    (lambda (sym)
      (if (eqv? sym i)
          ;; subst
          (apply-subst s sym)))

むむ、微妙。今日はこれで時間切れです。置換がハードル高いけど parse-term を確認したら微妙だった。

Comments