不是程序;期望一个可以应用于给定参数的过程:方案中的#<void>

时间:2017-04-08 20:26:39

标签: scheme racket

我得到了打印子(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))

1 个答案:

答案 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