是否可以将二维数组作为CLisp中映射的结果类型?

是否可以将二维数组作为CLisp中映射的结果类型?,lisp,common-lisp,Lisp,Common Lisp,在C-Lisp中,是否可以将映射结果收集到二维数组中?如何在函数中引用此数组 我试过这样的方法 (map 'Array'(3 3) #'somefunction sequence) 或 而且没有成功 当然,我开始使用的序列与我希望获得的结果数组的元素总数相同。否。根据hyperspec,结果类型说明符必须是序列类型。多维数组不是序列类型。当然,您可以编写一个函数来做您想要做的事情,但是它不能直接用map函数来完成 以下是您如何制作自己的: (defun map-to-array (fn

在C-Lisp中,是否可以将映射结果收集到二维数组中?如何在函数中引用此数组

我试过这样的方法

(map  'Array'(3 3)  #'somefunction  sequence) 

而且没有成功


当然,我开始使用的序列与我希望获得的结果数组的元素总数相同。

否。根据hyperspec,结果类型说明符必须是序列类型。多维数组不是序列类型。当然,您可以编写一个函数来做您想要做的事情,但是它不能直接用map函数来完成

以下是您如何制作自己的:

(defun map-to-array (fn sequence w h &optional (type t))
  (assert (<= (length sequence) (* w h)) (w h) "Result array too small.")
  (let ((result (make-array (list w h)
                            :element-type type))
        (x -1)
        (y 0))
    (map nil
         (lambda (e)
           (incf x)
           (when (= x w)
             (setf x 0)
             (incf y))
           (setf (aref result x y)
                 (funcall fn e)))
         sequence)
    result))

否。根据hyperspec,结果类型说明符必须是序列类型。多维数组不是序列类型。当然,您可以编写一个函数来做您想要做的事情,但是它不能直接用map函数来完成

以下是您如何制作自己的:

(defun map-to-array (fn sequence w h &optional (type t))
  (assert (<= (length sequence) (* w h)) (w h) "Result array too small.")
  (let ((result (make-array (list w h)
                            :element-type type))
        (x -1)
        (y 0))
    (map nil
         (lambda (e)
           (incf x)
           (when (= x w)
             (setf x 0)
             (incf y))
           (setf (aref result x y)
                 (funcall fn e)))
         sequence)
    result))

这样做的一个好方法是使用置换数组并映射到。下面是一个过于简单的例子:

(defun map-array (f a &rest make-array-kws &key &allow-other-keys)
  ;; Map F over A, which can be any array, returning a new array with
  ;; the same shape as A.  Keyword arguments get passwd to MAKE-ARRAY
  ;; of the result array.  This may not handle things like fill
  ;; pointers well or at all.
  (let ((r (apply #'make-array (array-dimensions a)
                   make-array-kws)))
    (map-into
     (make-array (array-total-size r)
                 :element-type (array-element-type r)
                 :displaced-to r)
     f
     (make-array (array-total-size a)
                 :element-type (array-element-type a)
                 :displaced-to a))
    r))

这样做的一个好方法是使用置换数组并映射到。下面是一个过于简单的例子:

(defun map-array (f a &rest make-array-kws &key &allow-other-keys)
  ;; Map F over A, which can be any array, returning a new array with
  ;; the same shape as A.  Keyword arguments get passwd to MAKE-ARRAY
  ;; of the result array.  This may not handle things like fill
  ;; pointers well or at all.
  (let ((r (apply #'make-array (array-dimensions a)
                   make-array-kws)))
    (map-into
     (make-array (array-total-size r)
                 :element-type (array-element-type r)
                 :displaced-to r)
     f
     (make-array (array-total-size a)
                 :element-type (array-element-type a)
                 :displaced-to a))
    r))

请注意,名为sequence的第二个参数实际上必须是一个向量。请注意,名为sequence的第二个参数实际上必须是一个向量。Hello FYI C-Lisp指的是CL语言的特定实现。其他实现包括SBCL、CCL、ECL、LispWorks……Hello FYI C-Lisp是CL语言的一种特定实现。其他实现包括SBCL、CCL、ECL、LispWorks…