Common Lisp:这不是NIL和& rest参数

时间:2014-04-26 04:47:34

标签: common-lisp cffi

在以下代码中的这一行((pointerp (first args)) (mem-aref (%vector-float-to-c-array (first args)) :float (second args)))上,(second args)会使用警告This is not a number NIL进行编译。该功能有效,但如何使用Lisp以独立于implimentation的方式摆脱此警告。解决方案需要非常快。代码需要很长时间才能正确运行并且运行良好,因此我无法真正改变它的运行。你不会认识到的功能实际上并不重要,因此要提前告知你的消息......提前感谢您的帮助。

(defun vector-float (&rest args)
  (cond ((eq (first args) nil) (return-from vector-float (%vector-float)))
    ((listp (first args))
     (c-arr-to-vector-float (first args)))
    ((symbolp (cadr args)) (%vector-float-size (first args)))
    ((pointerp (first args)) (mem-aref (%vector-float-to-c-array (first args)) :float (second args)))
    (t nil)))

1 个答案:

答案 0 :(得分:1)

如果(second args)NIL,则args没有secondsecondNIL。但是,mem-aref的第三个参数必须是一个数字,因为它是一个索引。这就是问题所在。

如果您的计划(second args)被允许NIL(或不存在),那么您必须测试这种可能性并避免将NIL传递给{{1 (可能省略了那个可选参数)。如果mem-aref 允许为(second args),那么该错误就会出现在程序的其他位置。

E.g。 (另),

NIL