Common Lisp为实现给定结果提供了许多灵活的编码选项。但是,有时很难选择最佳方法。例如,以下向量表达式都以不同的方式产生相同的结果。
(defparameter objects (list 1 2 3))
(apply #'vector objects)
(coerce objects 'vector)
(make-array (length objects) :initial-contents objects)
(read-from-string (format nil "#~S" objects))
当然,根据所需的输出,某些表达式比其他表达式更灵活;但对于上面给定的输出,什么标准对决定使用哪个有用?
答案 0 :(得分:4)
(apply #'vector objects)
受APPLY
的通常限制,即objects
不应超过CALL-ARGUMENTS-LIMIT
元素。即使您只有几个参数,这也是糟糕的风格。COERCE
很棒:它不仅能完成工作,而且能很好地传达意图。但是,您将无法为结果向量提供其他参数(例如填充指针等);你不能将嵌套列表转换成矩阵。MAKE-ARRAY
让您可以完全控制生成的数组:可调整性,填充指针,尺寸,元素类型,位移。READ-FROM-STRING
是一个很大的没有用于数据转换。在无用的计算方面,这种方法是Rube Goldberg的coerce
版本。除非您100%确定字符串包含的内容,否则它还会带来很多安全问题。在这里,您自己创建字符串,但如果您的数据包含重新定义代码的另一部分PRINT-OBJECT
的任何值,则代码可能会中断。