2013-03-23 38 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))))))