Scheme-使用if语句的语法

Scheme-使用if语句的语法,scheme,racket,Scheme,Racket,有人能解释为什么这不起作用吗?我正在遵循文档,无法理解为什么会出现错误: (define (functionName n) (if (n < 10) ;;if condition 1 ;; then condition 3)) ;; else condition (定义(函数名n) 如果(n

有人能解释为什么这不起作用吗?我正在遵循文档,无法理解为什么会出现错误:

 (define (functionName n)
    (if (n < 10)   ;;if condition
         1   ;; then condition
         3)) ;; else condition
(定义(函数名n)
如果(n<10);;如果条件
1;;然后是条件
3)) ;; 其他条件
我得到一个错误:

 application: not a procedure;
  expected a procedure that can be applied to arguments
   given: 5
   arguments...:
    #<procedure:<>
    10
应用:不是程序;
应为可应用于参数的过程
给定值:5
论据。。。:

# 函数应该是
if
中的第一件事(scheme使用前缀表示法,而不是中缀)

输出

1
当我在Chicken Scheme中运行它时。

试试这个:

(define (functionName n)
  (if (< n 10)
      1 
      3))
(定义(函数名n)
(如果(

记住:Scheme使用前缀表示法,这意味着所有运算符必须在操作数之前。换句话说,这是错误的:
(n<10)
,这是正确的:

您可以从两个方面看到这一点。您的代码是正确的,您只是称它为错误的(对于
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
发生的情况是,您的过程正在调用提供的过程,其中包含一个用于比较
3.
(函数名2);==>1.
由于Scheme可以将函数作为参数,这意味着每个参数都可以放在第一个位置,这可能正是您想要的,Scheme直到得到一个数字作为过程调用时才知道有问题

当您知道每个过程调用都被称为application时,错误消息非常清楚。它希望调用一个过程,但变量
n
后面有一个数字。“需要一个可以应用于参数的过程。给定:5”现在可能更有意义了

(define (functionName n)
  (if (< n 10)
      1 
      3))
(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
(define (function-name n)
  (if (< n 10)          ;; predicate expression
      1                 ;; consequent expression
      3))               ;; alternative expression

(function-name 15) ; ==> 3
(function-name 2)  ; ==> 1