使用点表示法访问CLOS插槽

And*_*rei 2 common-lisp clos

访问类槽时,而不是写

(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...会创建大量的样板代码.

我今天已经找到了答案,我只是将其作为问答发布,但如果有更好的解决方案或者我的解决方案存在问题,请随时添加新的答案或评论.

Pue*_*Pop 5

访问提供了一个用于访问插槽(以及散列表和其他东西)的点符号读取器宏.通过调用(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)