迭代地创建局部变量?

时间:2013-01-10 09:02:42

标签: macros lisp common-lisp let

我创建了一个函数,它将一个任意长的数字列表作为参数。从这个列表中,我希望使用let在本地创建矩阵。矩阵将根据列表中的数字序列具有行和列。例如,

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

应在本地创建

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

也就是说,第一个矩阵从列表中相邻元素的前两个元素中获取其尺寸,等等。

我的问题是:有没有办法在Mn表达式中迭代地创建任意长的局部变量集let?或者这是我应该使用宏的情况?

2 个答案:

答案 0 :(得分:1)

  

我的问题是:有没有办法在let表达式中迭代地创建任意长的局部变量Mn集合?或者这是我应该使用宏的情况吗?

不,您无法在运行时生成现有LET表达式的变量。

是的,您可以使用宏来生成具有“任意”数量的变量的LET表达式。但只有在宏扩展时(例如编译代码时)知道数字列表时才会知道。

为了理解您的问题,您需要向我们展示示例代码,您希望如何使用生成的变量?

答案 1 :(得分: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))))

感谢您的建议。 附:抱歉,我感冒了。

相关问题