1

私は再帰的階乗関数のための非常に単純なlispコードを書いています。番号を使用して呼び出すと、正常に機能します。ただし、番号以外のものを使用して呼び出しようとすると(例:a)、次のエラーが発生します。

エラー:バインドされていない変数`A'の値を取得しようとしました。[条件タイプ:UNBOUND-VARIABLE]

ただし、これは私のコードに含まれているはずです。これが私のコードです:

(defun FactorialRec (num)
   (cond                                                  
      ((not(numberp num))
         (princ "Argument must be a number.")
         (terpri)
         ())
      ((equal num 1) ;base case                                                       
         1)
      ((<= 1 num) (* num(FactorialRec (- num 1))))
   )
)

numberpがこれをキャッチしていない理由はわかりません。何か案は?ありがとう。

4

3 に答える 3

2

パラメータタイプのチェックをメインロジックに混在させないでください。check-type関数へのエントリ時、または関数のできるだけ早い段階でマクロを使用します。

(defun factorial (num)
  (check-type num (and integer (satisfies plusp)))
  (if (= num 1)
     1
     (* (factorial (1- num)) num))) 

フォーム(and integer (satisfies plusp))は型式です。Lisp型は、などの演算子と結合できandsatisfies型演算子を使用して、任意の述語関数から型を作成できます。したがって、ドメイン値が整数で正のオブジェクトであるタイプを指定できます。check-type変数がこのタイプに属しているかどうかを確認するために、変数を喜んで検証します。

1-また、引数から1を減算する組み込み関数を使用しました(- num 1)。これ1-はシンボルであり、特別な構文ではありません。

于 2012-09-23T03:48:16.520 に答える
1

関数が呼び出される前にエラーが発生しています。Lispインタプリタで関数呼び出し式を入力すると、最初にすべての引数が評価され、関数が呼び出されます。バインドされていない変数を使用すると、引数の評価は失敗します。

于 2012-09-23T03:15:51.413 に答える
0
Break 2 [6]> (FactorialRec "A")
Argument must be a number.

それは私のマシンで動作します。だから私はあなたが通過していたと思いますが、そうでAはありません"A"か?

于 2012-09-23T03:15:30.850 に答える