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