Scheme - 使用if语句的语法

时间:2014-11-06 20:11:49

标签: scheme racket

任何人都可以解释为什么这不起作用?我正在关注文档,我无法理解为什么会出现错误:

 (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

3 个答案:

答案 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中运行时。