通常你会使用带有结构的访问器函数。
您的代码定义了访问器函数point-x
和point-y
. 你可以使用那些。
您还可以SLOT-VALUE
在支持它的实现上使用 with 结构。我想这是大多数实现(GCL 将是一个例外)。有假设SLOT-VALUE
适用于结构的 Lisp 软件。我认为实现不会取消对它的支持。它不在标准中,因为一些实现者不想在已部署的应用程序中提供此功能。
所以两种方式都可以。
如果您想使用短名称,请使用访问器:
CL-USER 109 > (defstruct (point :conc-name)
(x 0) (y 0))
POINT
CL-USER 110 > (make-point :x 5 :y 3)
#S(POINT :X 5 :Y 3)
CL-USER 111 > (setf p1 *)
#S(POINT :X 5 :Y 3)
CL-USER 112 > (x p1)
5
CL-USER 113 > (setf p2 (make-point :x 2 :y 3))
#S(POINT :X 2 :Y 3)
CL-USER 114 > (list p1 p2)
(#S(POINT :X 5 :Y 3) #S(POINT :X 2 :Y 3))
CL-USER 115 > (mapcar 'x (list p1 p2))
(5 2)
然后必须通过包来防止各种访问器函数之间的名称冲突。
如果你想写一个更短的版本SLOT-VALUE
,那也很好。写一个宏。或者写一个内联函数。当然——为什么不呢?
正如我所说,SLOT-VALUE
在大多数实现中都使用结构。在这种情况下,您不应该关心 ANSI CL 规范没有定义它。在许多方面,实现扩展了 ANSI CL 规范。例如,通过SLOT-VALUE
处理结构,将流实现为 CLOS 类,将条件实现为 CLOS 类,提供元对象协议,......