gpt4 book ai didi

arrays - 具有良好多维数组编程支持的 Lispy 方言

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:40 27 4
gpt4 key购买 nike

是否有任何 Lisp 或 scheme 方言可以很好地支持数组和线性代数操作。我所说的良好支持并不是指 BLAS/LAPACk 的接口(interface),而是语言本身的高效数组原语。比如说,如果它能够对抗 Numpy,我会认为它是有效的。我听说 Stalin 的速度非常快,但我对 lisp 还很陌生,不熟悉这种语言中多维数组在语法上的方便操作和高效表示。特别是如果有个人经验的支持,将不胜感激(没有双关语)。

最佳答案

Arrays在标准 Common Lisp 中可以是多维的。

Array Dictionary描述了可用的操作。

CL-USER 12 > (defparameter *a* (make-array '(3 2 4) :initial-element 'foo))
*A*

CL-USER 13 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO)))

CL-USER 14 > (setf (aref *a* 1 1 2) 'bar)
BAR

CL-USER 15 > *a*
#3A(((FOO FOO FOO FOO) (FOO FOO FOO FOO))
((FOO FOO FOO FOO) (FOO FOO BAR FOO))
((FOO FOO FOO FOO) (FOO FOO FOO FOO)))

CL-USER 16 > (array-dimensions *a*)
(3 2 4)

在处理数组时,使用 Common Lisp 的另一个特性可能会有用:类型声明和编译器优化。 Common Lisp 允许在不声明类型的情况下编写通用代码。但是在关键部分,可以声明变量、参数、返回值等的类型。然后可以指示编译器摆脱一些检查或使用特定于类型的操作。支持量取决于编译器。还有更复杂的编译器,如 SBCL、LispWorks 和 Allegro CL,它们支持各种优化。一些编译器还给出了大量的编译信息。

最后的手段是使用外部函数接口(interface) (FFI) 来调用 C 代码或使用内联汇编程序(某些编译器支持)。

Common Lisp 在标准中默认有 LOOP 宏。它允许表达典型的命令式循环结构。还有一个替代方案,ITERATE宏 - 它可能对多维数组有一些优势。

另请注意,Lisp 数组有一些不寻常的特性,例如置换数组。它们使用一些其他数组的存储,但可以有不同的维度布局。

有时编写特殊的宏也很有用,它隐藏了使用数组的样板。如果没有带有类型声明的 Lisp 代码,多维数组和 LOOP 可能会有点大。不使用特殊语言抽象的典型代码示例如下:fft.lisp .

Common Lisp 编译器通常不提供开箱即用的 SIMD 指令或其他形式的数据并行性的特殊用途。可能存在异常(exception)情况。

关于arrays - 具有良好多维数组编程支持的 Lispy 方言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com