2009-09-01 18 views
3

を評価するときに、私は(実際には、elispの)Lispの学ぶことをしようとしている、と私はそれを評価するとき私が得る運動プロジェクトオイラーProblem 2Lispのエラーvoid-variable機能

(defun sumfib (n fn1 fn2 sum) 
    "Calculate Fibonacci numbers up to 4,000,000 and sum all the even ones" 
    (if (< 4000000 (+ fn1 fn2)) 
     sum 
    (if (equal n 3) 
     (sumfib 1 (+ fn1 fn2) fn1 (+ sum (+fn1 fn2))) 
     (sumfib (+ n 1) (+ fn1 fn2) fn1 sum))) 

として次の関数を書いてみました次のエラー:

Debugger entered--Lisp error: (void-variable fn1) 
    (+ fn1 fn2) 
    (< 4000000 (+ fn1 fn2)) 
... 

なぜfn1は認識されませんか? 'if'の前に(+ fn1 fn2)を入れようとすると、そこに不平を言っていないので、なぜここでエラーが出るのですか?

また、実際には機能が正しくない可能性があることを認識していますが、今は論理について心配していません。今のところ、私はこのエラーを理解することにのみ興味があります。

答えて

2

これがあなたの問題を解決するかどうかはわかりません(私はelispインタプリタを手軽に利用できません)が、あなたは正しいparenがありません。最初の 'if'ステートメントの最後に、 'sum'の後に1つあります。

(if (< 4000000 (+ fn1 fn2)) 
     sum) 

の代わり:

(if (< 4000000 (+ fn1 fn2)) 
     sum 

また、私はそこにいくつかの他の問題があるかもしれないと思います。

+0

ああ、私はかっこがありません...最初の 'if'の後ではなく、 'if-else'であるはずです。ありがとう。 –

+0

ああ、大丈夫です。私はSchemeに慣れていますが、これは少し違ったことです。私は少なくとも幾分役に立つとうれしい。 –

4
  1. 機能の最後に余分な閉じ括弧が必要です。
  2. (+fn1 fn2)(+ fn1 fn2)の場合は、2番目の句の最初の句にスペースが必要です。そうでなければ、ELispはfn2+fn1という名前の関数に渡すと解釈します。他のスタイルの問題の

カップル:

  1. condは特にelispのインデントスタイルを使用して、ネストされたIFSより読みずっと簡単です。
  2. =は、数字を比較するための通常の述語です。equalではありません。 equalは動作しますが、読者にとって面白いです。 (少なくともそれ私もelispのを知らないので、私は知っている他のすべてのLispで、私が間違っている可能性がない。)

は、ここで私は機能を再構築したい方法です。

(defun sumfib (n fn1 fn2 sum) 
    "Calculate Fibonacci numbers up to 4,000,000 and sum all the even ones" 
    (cond 
    ((< 4000000 (+ fn1 fn2)) sum) 
    ((= n 3) (sumfib 1 (+ fn1 fn2) fn1 (+ sum (+ fn1 fn2)))) 
    (t (sumfib (1+ n) (+ fn1 fn2) fn1 sum)))) 

私はそれを実行して答えを返しますが、プロジェクトのオイラー仕様では正しいかどうかわかりません。