我正在关注《光线追踪挑战》这本书。我创建了一个 vector3 和 color defstruct
(defstruct (vector3
(:conc-name nil)
(:constructor v3 (x y z w)))
(x 0.0 :type float)
(y 0.0 :type float)
(z 0.0 :type float)
(w 0.0 :type float))
(defstruct (colors
(:conc-name nil)
(:constructor colors (r g b w)))
(r 0.0 :type float)
(g 0.0 :type float)
(b 0.0 :type float)
(w 0.0 :type float))
以及其他一些函数,如比例乘数
(defun vector-scalar (s v1)
(vector3 (* s (x v1))
(* s (y v1))
(* s (z v1))
(* s (w v1))))
但是当我尝试加载文件时出现以下错误
caught WARNING:
; Derived type of COMMON-LISP-USER::V1 is
; (VALUES COMMON-LISP-USER::VECTOR3 &OPTIONAL),
; conflicting with its asserted type
; COMMON-LISP-USER::COLORS.
; See also:
; The SBCL Manual, Node "Handling of Types"
我认为程序内部的任何内容都具有局部作用域,所以我不明白为什么我认为是函数输入的内容会与 混淆defstruct
。如果我只加载向量,defstruct
则不会出现错误。
我担心的是,defstruct
我创建的任何具有四个参数的东西都会与 vector3 混淆
我不知道如何解决这个问题,因为我实际上不明白到底哪里出了问题。
您的两个结构定义都定义了一个名为的访问器
w
,因此它不存在。 SBCL 没有正确注意到这一点,而是对变量的类型进行了推断,但这种推断永远不会成立(它根据我认为的最后一个定义假设w
它是 a,colors
但根据其他访问器之一,它必须是 avector3
)。如果希望多个不同的类具有相同的访问器,则需要使用
defclass
notdefstruct
:defclass
将访问器定义为通用函数。