任何人都可以解释为什么这不起作用?我正在关注文档,我无法理解为什么会出现错误:
(define (functionName n)
(if (n < 10) ;;if condition
1 ;; then condition
3)) ;; else condition
我收到错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 5
arguments...:
#<procedure:<>
10
答案 0 :(得分:1)
试试这个:
(define (functionName n)
(if (< n 10)
1
3))
请记住:Scheme使用前缀表示法,这意味着所有操作符必须在之前操作数。换句话说,这是错误的:(n < 10)
,这是正确的:(< n 10)
。
答案 1 :(得分:1)
你可以通过两种方式看到这一点。您的代码是正确的,您只是将其调用错误(n
的错误类型)或您的代码被意外地用中缀表示法编写。我将说明两者:
传递了错误的论点
n
可以是任何数据类型,它甚至可以是一个过程,如果它是没有任何问题的代码:
(define (compare-15 predicate-procedure argument)
(predicate-procedure 15 argument))
(define (compare-2 predicate-procedure argument)
(predicate-procedure 2 argument))
(functionName compare-15) ; ==> 3
(functionName compare-2) ; ==> 1
您的过程是使用比较<
和参数的过程调用提供的过程。
意外中缀
Algol程序员用于前缀fun( expr )
和中缀x cmp y
,而在LISP方言中,所有这些都有一个共同形式,并且一直是前缀:(fun expr)
和(cmd x y)
。
(define (function-name n)
(if (< n 10) ;; predicate expression
1 ;; consequent expression
3)) ;; alternative expression
(function-name 15) ; ==> 3
(function-name 2) ; ==> 1
因为Scheme可以有函数作为参数,意味着每个参数都可以放在第一个位置,它可能正是你想要的,而Scheme不知道,直到它得到一个数字作为一个程序来调用是错的。
当您知道每个过程调用都被称为应用程序时,错误消息非常清楚。它期望调用一个过程,但在变量n
后面有一个数字。 &#34;期望一个可以应用于参数的过程。给出:5&#34;现在可能更有意义了吗?
答案 2 :(得分:0)
该函数应该是if
中的第一件事(方案使用前缀表示法,而不是中缀)。
(define (functionName n)
(if (< n 10) ;;if condition
1 ;; then condition
3)) ;; else condition
然后
(functionName 2)
输出
1
当我在Chicken Scheme中运行时。