为给定的作业选择适当的编码表达式

时间:2017-03-18 17:26:31

标签: vector common-lisp

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))

当然,根据所需的输出,某些表达式比其他表达式更灵活;但对于上面给定的输出,什么标准对决定使用哪个有用?

1 个答案:

答案 0 :(得分:4)

  • (apply #'vector objects)APPLY的通常限制,即objects不应超过CALL-ARGUMENTS-LIMIT元素。即使您只有几个参数,这也是糟糕的风格。
  • COERCE很棒:它不仅能完成工作,而且能很好地传达意图。但是,您将无法为结果向量提供其他参数(例如填充指针等);你不能将嵌套列表转换成矩阵。
  • MAKE-ARRAY让您可以完全控制生成的数组:可调整性,填充指针,尺寸,元素类型,位移。
  • 一般来说,
  • READ-FROM-STRING是一个很大的没有用于数据转换。在无用的计算方面,这种方法是Rube Goldberg的coerce版本。除非您100%确定字符串包含的内容,否则它还会带来很多安全问题。在这里,您自己创建字符串,但如果您的数据包含重新定义代码的另一部分PRINT-OBJECT的任何值,则代码可能会中断。