2013-03-23 44 views
0

我试图在计划中生成一个符号表,我卡在集合符号函数。 该编号对应代码的块级别或“范围”。如何在计划中添加到嵌入式列表?

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))) 

我如何总是添加到范围中的第一个列表最深的列表?

+0

我假设这些应该是普通列表。是否有理由将新绑定添加到列表的末尾而不是开始?这需要追加(或额外的递归)。 – 2013-03-23 17:14:51

+0

是否添加新的绑定来保持深度。这样,深度可以很容易地通过考虑外部列表的长度来计算。 – carboncomputed 2013-03-23 17:52:05

回答

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))))))