我得到了打印子(A 3333)(A 4444),但我无法弄清楚两者的打印效果 sub(A 3333)(A 4444) 加(R 0)(R 1)
(define tree '("S" ( ("-"("A" 3333 )("A" 4444))) ("W" (("+" ("R" 0) ("R" 1))))))
(define (OperandNode on)
(display on))
(define (TwoOperandNode x)
(car x)
(if(equal? (car x) "-")
((display "sub")
(OperandNode (cadr x))
(OperandNode (caddr x)))))
(TwoOperandNode (caadr tree))
(define (WhileNode h)
(car h)
(if(equal? (car h) "+")
((display "add")
(WhileNode (cadr h))
(WhileNode (caddr h)))))
(WhileNode (caaadr tree))
答案 0 :(得分:0)
您知道以下表格:
(+ 1 2)
评估部件,例如。 +
会对过程#<procedure:+>
进行评估,并对这些数字进行评估。然后Scheme应用它并获得结果3
。现在看看你在WhileNode
中做了什么:
((display "add") (WhileNode (cadr h)) (WhileNode (caddr h))) ; ==
(#<void> ...) ; throws error
所以这里的零件得到评估。但问题是运算符位置(display "add")
中的表达式返回#<void>
。它不知道如何继续这样做。在Java中,相同的代码如下所示:
System.out.println("add")(WhileNode(cadr(h)), WhileNode(caddr(h)));
在Scheme中,将表达式置于操作员位置是完全自然的,但它必须评估一个过程:
(define (abs-proc x)
(if (positive? x)
values
-))
((abs-proc -5) -5) ; ==
(- -5) ; ==
; ==> 5
((abs-proc 3) 3) ; ==
(values 3) ; ==
; ==> 3