2010-11-19 8 views
3

私はこのようなLisp関数を書いた:Lispの関数呼び出しエラー

(defun power (base exponent) 
    (if (= exponent 0) 
     1 
    (* base (power (- exponent 1))))) 

私はそれを呼び出すようにしようとすると、しかし、私は若干の誤差が出る:

CL-USER 2 > (power 2 3) 

Error: POWER got 1 arg, wanted at least 2. 
    1 (abort) Return to level 0. 
    2 Return to top loop level 0. 

Type :b for backtrace or :c <option number> to proceed. 
Type :bug-form "<subject>" for a bug report template or :? for other options. 

CL-USER 3 : 1 > (power 2) 

Error: POWER got 1 arg, wanted at least 2. 
    1 (abort) Return to level 1. 
    2 Return to debug level 1. 
    3 Return to level 0. 
    4 Return to top loop level 0. 

Type :b for backtrace or :c <option number> to proceed. 
Type :bug-form "<subject>" for a bug report template or :? for other options. 

CL-USER 4 : 2 > (power 2 3 4) 

Error: POWER got 3 args, wanted 2. 
    1 (continue) Ignore the extra arg. 
    2 (abort) Return to level 2. 
    3 Return to debug level 2. 
    4 Return to level 1. 
    5 Return to debug level 1. 
    6 Return to level 0. 
    7 Return to top loop level 0. 

Type :b for backtrace or :c <option number> to proceed. 
Type :bug-form "<subject>" for a bug report template or :? for other options. 

ここで何が起こっていますか?もし私が2つの議論をすれば、私はそれを与えたと思う。私はそれを3つ与えると、私はそれを3つ与えたと考えます。

(power (- exponent 1)) 

それは次のようにする必要があります:

(power base (- exponent 1)) 

答えて

10

を与えたと考えて再帰呼び出しが問題です。最初の引数として基数を渡すのを忘れた。

(* base (power (- exponent 1)))))

次のようになります。

(* base (power base (- exponent 1)))))

6

私はそれを1つずつ与えると、それはそれは引数を1つしか持っていることを再帰呼び出しである私はそれを一...

3

は、あなたの関数をコンパイルします。 LispWorksでは、c-sh-cを使用してエディタで定義をコンパイルします。

ここでREPLで:

CL-USER 18 > (defun power (base exponent) 
       (if (= exponent 0) 
        1 
       (* base (power (- exponent 1))))) 
POWER 

CL-USER 19 > (compile 'power) 
;;;*** Warning in POWER: POWER is called with the 
;;; wrong number of arguments: Got 1 wanted 2 

コンパイラは、すでにコードに問題があることを教えてくれます。

LispWorksリスナ(REPL)はコンパイルされません。関数COMPILEを使用してリスナーで入力した定義をコンパイルする必要があります。あるいは、エディタウィンドウに定義を入力してそこからコンパイルすることもできます(ファイル、バッファ、または式をコンパイルすることによって)。 LispWorksには、エラーが発生した場所にコードを配置する機能もあります。

1

Lispにはexptという機能が付いているので、自分で定義する必要はありません。

(これは練習問題または宿題でなければ、exponentiation by squaringなどのより効率的な方法を見てみるとよいでしょう)

関連する問題