2016-09-14 4 views
-3

私はLISPを初めて使っていて、操作配列を使って何か問題がありました。リストはもっと広く使われているようだから、そこには多くのリソースがない。LISPでの配列の使い方 - 最小値の検索

(defun FIND-MIN(x) 
(setq ctr (aref x 0)) (setq pos 1) (setq finalpos 1) 
(loop while (< pos (array-total-size x)) 
    do 
    (
     (if (< ctr (aref Z pos)) 
      (progn 
       (setq ctr pos) 
       (setq finalpos pos)) 
    (incf pos) 
    ) 
) 
    finalpos 
) 

この背後にある私の推論が最初にある:私は、私は、配列に目を通すと最小値が発生したスポットを返そうとしています次のコードを(私のフォーマットが正しいかどうかはわからない)持っていますデフォルトで最初の位置に設定され、最小値を追跡するctr、配列内の位置を追跡する位置カウンタ(pos)、最小値の発生場所を格納するfinalpos変数を作成します。次に、posが配列の最後にくるまでループします。すべてのステップで、要素がctrより小さいかどうかをチェックし、ctrが更新されてfinalposが更新されているかどうかをチェックします。次に配列をインクリメントするためにposがインクリメントされます。各要素がチェックされた後、プログラムはfinalposを返します。これは最小の要素の位置でなければなりません。

私はこのことから得るエラーは次のとおりです。

- SYSTEM ::%EXPAND-FORM:(SETQ CTR(AREF X 0))でなければなりませんラムダ式Iはしなかった

をarefは単一の値(最初の値)を取得しており、単一の値を取り出すことはarefの仕事であるため、ラムダ式が必要だと思っています。私の論理に欠陥があるかどうかも指摘しておきましょう。なぜなら、この新しい言語はこれまで使っていた言語とはまったく異なっているからです。すべての助けが大歓迎です!

+0

また、典型的なスタイルは、自分の行に括弧を末尾に残していません。しかし、これはあなたが見たように構文エラーを引き起こすことはありません。 – verdammelt

+0

'(setq pospos 1)'、 '(setq finalpos 1)'、 '(loop ...)'という引数に '(setq ctr(aref x 0))'を関数として適用しようとしています。 'finalpos'です。近くの本のLisp構文を見直すべきでしょう。 (私は[Practical Common Lisp](http://www.gigamonkeys.com/book/)をお勧めします。) – molbdnilo

+0

@molbdniloプログラムの前後で余分な括弧を削除しました。 。私は元の投稿を編集しました。それはあなたが記述していたエラーですか?その特定の場所でエラーを修正するのに役立ちましたが、以前のようにラムダを求める新しいエラーが表示されました:SYSTEM ::%EXPAND-FORM:(IF(

答えて

0

defunフォームに構文エラーがあります。具体的には、defunの本体を括弧で囲みました。これは間違っています。 defunの形式は:

(defun NAME (ARGS) [DOCUMENTATION] BODY)

(CLHS参照)。

本文は一連のフォームになります。あなたはコンパイラ/インタプリタを混乱させる括弧で囲まれた一連のフォームをラップしています。

(私たちは文法的に正しいコードを持ってまで、私はスタイル時にはコメントはありません。)

+0

プログラムの前後に余分な括弧を削除しました。私は元の投稿を編集しました。それはあなたが記述していたエラーですか?その特定の場所でエラーを修正するのに役立ちましたが、以前のようにラムダを求める新しいエラーが表示されました:SYSTEM ::%EXPAND-FORM:(IF(

+0

同じ問題です。しかし今は 'loop'の' do'節にあります。 – verdammelt

関連する問題