0

スキームでシンボル テーブルを生成しようとしていますが、set-symbol 関数に行き詰まっています。番号は、コードのブロック レベルまたは「スコープ」に対応します。

First symbol it reads in
((c class 0))
Next symbols 
(((c class 0) (a int 0) (b float 0)))
We read a bracket and read the next variables to a new scope.
(((a char 1) (d int 1)) ((c class 0) (a int 0) (b float 0)))
We leave that scope and "pop the stack".
(((c class 0) (a int 0) (b float 0)))

スコープ内の最初のリストの最も深いリストに常に追加するにはどうすればよいですか?

4

1 に答える 1

1

別の表現を使用したほうがよいと思います。多くの1つ、多くは次のようになります。

(define (make-symbol-table parent alist)
  `(SYMBOL-TABLE ,parent ,@alist))
(define symbol-table-parent cadr)
(define symbol-table-alist  cddr)

(define (symbol-table-depth table)
  (let ((parent (symbol-table-parent table)))
    (if (not parent)
        1
        (+ 1 (symbol-table-depth parent))))

(define (symbol-table-lookup table name)
  (cond ((assoc name (symbol-table-alist table)) => cdr)
        (else (let ((parent (symbol-table-parent table)))
                (and parent (symbol-table-lookup parent name))))))
于 2013-03-23T18:42:11.880 に答える