8

私は Lisp に不慣れで、それに慣れるために簡単なプログラムをいくつか書いています。私が行っていることの 1 つは、階乗メソッドの再帰的で反復的なバージョンを作成することです。しかし、私は問題に遭遇し、それを解決できないようです。

Lispで同様のエラーを見ました : CHAR は宣言もバインドもされ ていませんが、OP が「入力ミス」を犯したことに気付いた以外は、実際には解決策に達していませんでした。REPL では setf 関数を使用でき、正常に動作します。また、emacs で LispBox を使用しています。提案をいただければ幸いです。

(defun it-fact(num)
  (setf result 1)
  (dotimes (i num)
    (setf result (* result (+ i 1)))
  )
)

IT-FACT の WARNING : RESULT は宣言もバインドもされていません。SPECIAL と宣言されているかのように扱われます。

4

3 に答える 3

6

Lisp では、ローカル変数は、ローカル変数を作成する LET またはその他の形式で明示的に宣言する必要があります。これは、変数への代入が現在のレキシカル スコープで変数を作成する Python や JavaScript などとは異なります。

あなたの例は次のように書き直すことができます:

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

トピックから外れたコメント: 閉じ括弧を別の行に置いても意味がありません。

于 2009-09-06T08:58:36.803 に答える
5

使用を開始する前に、たとえば「let」を使用して、変数「result」をバインドする必要があります。

(defun it-fact(num)
  (let ((result 1))
    (dotimes (i num)
      (setf result (* result (+ i 1))))))

詳細については、これをお読みください...

于 2009-09-06T08:34:20.187 に答える