functional-programming - 为什么在Scheme中cond是一种特殊形式,而不是函数?

(defun triangle-using-cond (number)
  (cond 
    ((<= number 0) 0) ; 1st
    ((= number 1) 1)  ; 2nd
    ((> number 1)     ; 3rd
      ;; 4th
      (+ number
         (triangle-using-cond (1- number))))))

我知道的关于Cond的事情
  • 它允许多个测试和替代表达式
  • 它具有预先指定的评估顺序。例如,第一个条件将始终评估它是否正确

  • 我无法区分的一件事是cond与函数的不同之处!

    最佳答案

    像这样评估函数调用(e0 e1 e2)

    1. e0 is evaluated, the result is (hopefully) a function f
    2. e1 is evaluated, the result is a value v1
    3. e2 is evaluated, the result is a value v2
    4. The function body of `f` is evaluated in an environment in which
       the formal parameters are bound to the values `v1` and `v2`.
    

    请注意,在激活函数主体之前,将对所有表达式 e0e1e2求值。

    这意味着在评估 (foo #t 2 (/ 3 0))时-在将控制权移交给 (/ 3 0)的主体之前,像 foo这样的函数调用将导致错误。

    现在考虑特殊形式 if。在 (if #t 2 (/ 3 0))中,对表达式 #t进行求值,并且由于值non-false,因此对第二个表达式 2进行求值,结果值为2。此处,从不对 (/ 3 0)求值。

    相反,如果 if是一个函数,则在激活主体之前先评估表达式 #t2(/ 3 0)。现在 (/ 3 0)将产生一个错误-即使不需要这些表达式的值。

    简而言之:函数调用将始终对所有参数求值,然后再将控件传递给函数主体。如果不对某些表达式求值,则需要一种特殊的形式。

    这里 ifcond是形式的示例,它们不评估所有子表达式-因此它们需要是特殊形式。