访问类槽时,而不是写
(defmethod get-name ((somebody person) (slot-value somebody 'name))
Run Code Online (Sandbox Code Playgroud)
是否可以使用点符号aka C++,即
(defmethod get-name ((somebody person) somebody.name) ?
Run Code Online (Sandbox Code Playgroud)
否则,当方法中有许多槽操作时,(slot-value...
会创建大量的样板代码.
我今天已经找到了答案,我只是将其作为问答发布,但如果有更好的解决方案或者我的解决方案存在问题,请随时添加新的答案或评论.
库访问提供了一个用于访问插槽(以及散列表和其他东西)的点符号读取器宏.通过调用(access:enable-dot-syntax)启用阅读器宏后,您将能够使用#D.使用其他语言中流行的点语法访问插槽名称.
(defclass person ()
((name :initarg :name :reader name)))
CL-USER> (access:enable-dot-syntax)
; No values
CL-USER> (defvar *foo* (make-instance 'person :name "John Smith"))
*FOO*
CL-USER> #D*foo*
#<PERSON #x302001F1E5CD>
CL-USER> #D*foo*.name
"John Smith"
Run Code Online (Sandbox Code Playgroud)
还有一个with-dot
,如果你不希望使用阅读器的宏宏
CL-USER> (access:with-dot () *foo*.name)
"John Smith"
Run Code Online (Sandbox Code Playgroud)