2017-04-08 34 views
-2

我得到了它的打印子(A 3333)(A 4444),但我不能打印出 sub(A 3333)(A 4444) 附加(R 0)(R 1)不是程序;預期的程序,可以適用於以下參數:#<void>在方案

(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

括號不用於分組。而且,由於您使用的是Racket,因此讓DrRacket會爲您縮進代碼。 – molbdnilo

回答

0

你知道爲以下形式:

(+ 1 2) 

零件進行評估,例如。 +得到評估ta程序#<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))); 

在流程的完美自然有操作員位置的表達式,但必須計算出一個過程:

(define (abs-proc x) 
    (if (positive? x) 
     values 
     -)) 

((abs-proc -5) -5) ; == 
(- -5)    ; == 
; ==> 5 

((abs-proc 3) 3) ; == 
(values 3)  ; == 
; ==> 3 
相關問題