0

任意の数の長いリストを引数として受け取る関数を作成しました。このリストから、 を使用してローカルで行列を作成したいと考えていますlet。マトリックスには、リスト内の数列に基づいた行と列があります。例えば、

>(foo '(2 2 3) arg2 ... argn)

ローカルに作成する必要があります

M1: #2a((0 0)(0 0))     M2: #2a((0 0 0)
                                (0 0 0))  

つまり、最初の行列は、リスト内の要素に隣接する最初の 2 つの要素から次元を取得します。

私の質問は次のとおりです:式で任意に長いローカル変数のセットを繰り返し作成する方法はありMnますletか? それとも、これはマクロを使用する必要がある場合ですか?

4

2 に答える 2

1

私の質問は次のとおりです。let式で任意の長さのローカル変数Mnのセットを繰り返し作成する方法はありますか?それとも、これはマクロを使用する必要がある場合ですか?

いいえ、実行時に既存のLET式の変数を生成することはできません。

はい、マクロを使用して、「任意の」量の変数を含むLET式を生成できます。ただし、マクロ展開時(たとえば、コードをコンパイルするとき)に数値のリストを知っている場合に限ります。

あなたの質問を理解するために、サンプルコードを示す必要があります。生成された変数をどのように使用しますか?

于 2013-01-10T11:14:38.183 に答える
1

私は実際に行列をベクトルに保持することで問題を解決することができました:

(defun sum-net (structure)
;make vectoor to hold matrices
  (let ((matrices (make-array `(,(length structure)))))
;fill structures with empty matrices->weights & vectors->Net-Layers
    (dotimes (n (1- (length matrices)))
      (setf (svref matrices n) 
            (make-array `(,(nth n structure)
                          ,(nth (+ n 1) structure))))

提案をありがとう。PS 遅れてすみません、私はインフルエンザにかかっています。

于 2013-01-11T11:57:28.723 に答える