2

「if」が未定義の関数だと言っているのはなぜですか?

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

1 に答える 1

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)

if3 番目の節が の値を変数として取得しようとしているためです。あなたが望んでいたのはそれ以外の節だったと思います。3 番目の句を他の句と同じ形式にし、常に true になる条件を付けます。たとえば、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

于 2013-09-22T02:17:46.980 に答える