使用汽车和司机
问题描述:
我是新来的计划,很难与汽车和司机使用。我在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。
答
您需要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
))))
希望这有助于问题的欢迎。
你想要做什么'分配等?只要列出所有这些清单,或者您是否正在尝试解释AST? –
我正在尝试遍历AST并解释它。 – BearBearBear
您是否熟悉递归?你可以尝试写一个递归函数来做到这一点? –