2013-09-22 4 views

ответ

2

С обычного форматирования применяется и некоторых комментариев, ваш код:

(defun sum (n m) 
    ;; if n and m are integers 
    (if (and (integerp n) (integerp m)) 
     ;; then … 
     (cond 
     ;; first case: if the expression `(zerop n)` is true, then return m 
     ((zerop n) m) 
     ;; second case: if the expression `(zerop m)` is true, then return n 
     ((zerop m) n) 
     ;; third case: if the expression `if` is true, then 
     ;; evaluate (< n 0), evaluate (sum (+ n 1) (- m 1)), 
     ;; and return (sum (- n 1) (+ m 1)) 
     (if (< n 0) 
      (sum (+ n 1) (- m 1)) 
      (sum (- n 1) (+ m 1)))) 
     ;; else return nil 
     nil)) 

Когда я оцениваю это определение в Emacs, а затем попытаться оценить, например, (sum 2 3), ошибка я получаю на самом деле:

Debugger entered--Lisp error: (void-variable if) 
    (cond ((zerop n) m) ((zerop m) n) (if (< n 0) (sum ... ...) (sum ... ...))) 
    (if (and (integerp n) (integerp m)) (cond (... m) (... n) (if ... ... ...)) nil) 
    sum(2 3) 
    eval((sum 2 3)) 
    eval-last-sexp-1(nil) 
    eval-last-sexp(nil) 
    call-interactively(eval-last-sexp nil nil) 

потому, что третий пункт пытается принять значение if в качестве переменной. Я ожидаю, что то, что вы хотели, было иначе. Сделайте третье предложение такой же вид, как и другие, с условием, что всегда будет истинным, например, t:

(defun sum (n m) 
    (if (and (integerp n) (integerp m)) 
     (cond 
     ((zerop n) m) 
     ((zerop m) n) 
     (t (if (< n 0) 
       (sum (+ n 1) (- m 1)) 
       (sum (- n 1) (+ m 1))))) 
     nil)) 

Затем (sum 2 3) возвращается 5.

Смежные вопросы