2017-08-04 71 views
0

我是新來的計劃,很難與汽車和司機使用。我在AST中有一個AST字符串字面值。使用汽車和司機

(define ast '(program 
    ((assign (var i int) (call (func getint void int)())) 
    (assign (var j int) (call (func getint void int)())) 
    (while (neq (var i int) (var j int)) 
    ((if (gt (var i int) (var j int)) 
     ((assign (var i int) (minus (var i int) (var j int)))) 
     ((assign (var j int) (minus (var j int) (var i int))))))) 
    (call (func putint int void) ((var i int))))) 
) 

我知道汽車返回ast的頭。所以

(car ast) 

返回的程序。

我很困惑如何使用car和cdr從ast獲取字符串,例如'assign',while,'if,and'call。

+0

你想要做什麼'分配等?只要列出所有這些清單,或者您是否正在嘗試解釋AST? –

+0

我正在嘗試遍歷AST並解釋它。 – BearBearBear

+2

您是否熟悉遞歸?你可以嘗試寫一個遞歸函數來做到這一點? –

回答

2

您需要undertstand如何對和列表建成,從The Racket Reference

一對正好結合了兩個值。第一個值是用car過程訪問的,第二個值是用cdr過程訪問的。配對不可變(但看到可變對和列表)。

遞歸定義一個列表:它可以是常量空值,也可以是其第二個值是列表的對。

基本上 - 每對是二 - (x和y) 汽車得到美的X CDR獲取方式Y

注意,X Y可以同時爲對或者列出自己,就像你AST。

例如:(出相同的參考的)

> (define lst1 (list 1 2 3 4)) 

>lst1 

'(1 2 3 4) 

通知,「(1 2 3 4)實際上是:。。。(1(2(3(4())))< - 非常重要,要知道在方案實施

> (car lst1) 

1 

> (cdr lst1) 

'(2 3 4) 

> (car (cdr lst1)) 

2 

另一種方式來鏈car和cdr調用(右讀): CADR方式(CDR LST),然後對答案=(車車(CDR lst))

> (cdddr lst1) 

'(4) 

> (cadddr lst1) 

4 

> (define lst2 (list (list 1 2) (list 3 4))) 

>lst2 

'((1 2) (3 4)) 

=((1。 (2.()))。 (3(4())))

> (car lst2) 

'(1 2) 

>(cdr lst2) 

'((3 4)) 

這實際上是((3-(4。()))。())=((3 4)。())=((3- 4)) 你沒有問,但是,我假設你要遍歷樹/列表。 最終你將有一個recurssion遍歷(除非使用不適合在這個階段先進的方法,即檢查CPS時準備好),像這樣:

(define runner 
    (lambda (tree) 
    (if (null? tree) 
     null 
     (let ((first_element (car tree)) 
       (rest_of_tree (cdr tree))) 
      ;body: 
      ;do some logic like: 
       ;if first is list call runner on it 
       ;else check what string is there (recognize tree root) 
      ;call (runner rest_of_tree) 
      ;possibly chain answer of logic and call together 
     )))) 

希望這有助於問題的歡迎。