【问题标题】:Iteratively create local variables?迭代创建局部变量?
【发布时间】:2012-12-24 14:46:09
【问题描述】:

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

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

应该在本地创建

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

也就是说,第一个矩阵的维度取自列表中相邻元素的前两个元素,以此类推。

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

【问题讨论】:

  • 什么是arg2 &c?这些是变量名吗?

标签: macros lisp common-lisp let


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我实际上设法通过将矩阵保存在向量中来解决问题:

    (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))))
    

    感谢您的建议。 附言抱歉耽搁了,我感冒了。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2016-06-04
      • 2020-11-22
      • 1970-01-01
      • 2021-06-28
      • 2013-09-04
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多