Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 具有由函数确定的初始内容的数组_Macros_Multidimensional Array_Lisp_Common Lisp - Fatal编程技术网

Macros 具有由函数确定的初始内容的数组

Macros 具有由函数确定的初始内容的数组,macros,multidimensional-array,lisp,common-lisp,Macros,Multidimensional Array,Lisp,Common Lisp,我试图创建一个多维数组,其初始内容由函数决定。对于数组的任何指定维度都很容易做到 例如,对于2x2阵列: (defmacro array-generation (fun &rest size-dimensions) (let ((a (gensym)) (b (gensym))) `(make-array ',size-dimensions :initial-contents (loop for ,a from 0 belo

我试图创建一个多维数组,其初始内容由函数决定。对于数组的任何指定维度都很容易做到

例如,对于2x2阵列:

(defmacro array-generation (fun &rest size-dimensions)
 (let ((a (gensym)) 
       (b (gensym))) 
    `(make-array ',size-dimensions
       :initial-contents 
          (loop for ,a from 0 below (first ',size-dimensions) by 1           
       collect 
          (loop for ,b from 0 below (second ',size-dimensions) by 1
       collect (,fun  ,a ,b))))))

(defparameter bla (array-generation + 2 3))
给我#2A((0112)(1233))

如何将宏推广到任何维度? 例如2x3x5x6x7x8

(defparameter bla (array-generation + 2 3 5 6 7 8))

你已经有了答案,所以我想补充一下,作为思考的食粮。三项意见:

  • 数组生成
    不必是宏;它可以是一个函数
  • 显式初始化数组可能更容易,而不是生成列表供
    :initial contents
    使用
  • from
    的默认初始值为0,因此可以忽略它

你能解释一下为什么这是一个宏而不是一个函数吗?这不是生成了一个列表而不是一个数组吗?好的,结果应该作为问题代码的
:初始内容

(defmacro array-generation (fun &rest dims)
  (let ((syms (loop :repeat (length dims) :collect (gensym))))
    (reduce (lambda (x y) (append x (list y)))
            (mapcar (lambda (sym dim)
                      `(loop for ,sym from 0 below ,dim by 1 collect))
                    syms dims)
            :initial-value (cons fun syms)
            :from-end t)))
(defun array-generation (fn &rest dimensions)
  (let ((array (make-array dimensions)))
    (labels ((init (dims indices)
               (if (null dims)
                   (setf (apply #'aref array indices) (apply fn indices))
                   (loop for i below (first dims) do
                         (init (rest dims) (cons i indices))))))
      (init (reverse dimensions) nil)
      array)))