2016-05-12 1 views
0

ちょっと私はlisp関数の助けが必要です。私は作成するはずです:lisp最後の要素の機能的なフォーム

(myLast L) リストL. の最後の要素まで評価します。

(atom X) 
(quote X) 
‘X 
(eq X Y) 
(cons X L) 
(car L) 
(cdr L) 
(list A B C) 
(if X Y Z)  
(cond (C1 S1) (C2 S2) …… (Cn Sn))  

を私が入れたときに、私は右のそれを持っていたと思った:(myLast「(paeg))→G

私たちはクラスで指定されている唯一のものはLispのために事前に定義されたすべてのフォームを使用しカント私はLISPに完全に新しいです

Error: The variable MYHW4.LISP is unbound. 
Error signalled by EVAL 
Backtrace: EVAL 
Broken at SYSTEM::GCL-TOP-LEVEL. 

をしてのcompletしようとしている:私はエラーを取得していますが

(defun myLast (L) 
    (if ((eq L '()) (cdr L)) 
     (car L) 
     (myLast (cdr L)))) 

この割り当て。私はあなたが私を助けて、なぜ私がこのエラーを受けているのかを教えてくれることを願っていました。ありがとう!

答えて

1

コードに複数の問題があります。

あなたは余分なカッコがあります。 ((eq L '())は、オペレータ位置で許可される唯一の式は無名関数です。

ifには帰納表現しかありませんが、代替はできません。それは最後の式ではないので、デッドコードです。

あなたはcarを実行しますが、これまでのコードでも実際の位置にはありません。

テール表現は再帰であり、無条件に行われます。それは無限再帰と呼ばれています。私はおそらくあなたがこのような何かを意味だと思う

(defun myLast (list) 
    (if (null (cdr list)) 
     (car list) 
     (myLast (cdr list)))) 
+0

ああ、ありがとう! – John

1

エラーメッセージはコードとは無関係です。おそらく(load myhw4.lisp)とタイプして引用符をつけていないのであれば、あなたのLispは正しい値であると考えています。myhw4.lispは存在しません。あなたは文字列"like so"を引用する必要があります。

また、((eq L '()) ...)は、機能またはラムダではない(eq ...)であるため、問題があります。それはエラーを通知します。

上記のコードは間違っていますが、それほど遠くはありません。

+0

は答えをいただき、ありがとうございます。私はそれをロードしようとしている間に私が間違っていたことを見つけました。 – John

+0

(defunのmyLast(L) ((ラムダ(EQのL「())(CDRのL)の場合) (カーL) (myLast(CDRのL)))) これは私がそれを変更したものですが、私は最後のものの代わりにリストの最初のアイテムを取得しています。助言がありますか? – John

+0

または単に '(if(eq(cdr L)())(car L)(my-last(cdr L)))'です。私はあなたのLispがあなたの 'lambda 'の引数リストを拒否しなかったことに驚いています。さらに、(lambda ...)x yの場合のみ)テストすると、シンボルNILでない無名関数がブール値コンテキストで真と評価されるため、テストは常にTです。だからあなたはいつも最初の要素を取るでしょう。もう少しテストすれば助けになるかもしれません。 – coredump

関連する問題