【问题标题】:not a procedure; expected a procedure that can be applied to arguments given: #<void> in scheme不是程序;期望一个可以应用于给定参数的过程:#<void> in scheme
【发布时间】:2017-04-08 20:26:38
【问题描述】:

我得到了 print sub (A 3333) (A 4444),但我想不出两者都打印出来 子 (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))

【问题讨论】:

  • 括号不用于分组。既然您使用的是 Racket,请让 DrRacket 为您缩进您的代码。

标签: scheme racket


【解决方案1】:

你知道下面的表格:

(+ 1 2)

对零件进行评估,例如。 + 被评估 ta 过程 #&lt;procedure:+&gt; 和数字被评估自己。然后 Scheme 应用它并得到结果3。现在看看你在WhileNode做了什么:

((display "add") (WhileNode (cadr h)) (WhileNode (caddr h))) ; ==
(#<void> ...) ; throws error

所以零件在这里得到评估。但是问题是运算符位置的表达式(display "add") 返回#&lt;void&gt;。它不知道如何继续下去。在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多