lisp - 如何从 Lisp 类导出槽和访问器?

标签 lisp common-lisp sbcl clos

这是我类的包:

(in-package :cl-user)
(defpackage foo
  (:use :cl)
  (:export :bar))
(in-package :foo)

(defclass bar ()
  (baz))

我可以在包 cl-user 中创建一个 bar 的实例。

CL-USER> (defvar f)
F
CL-USER> (setf f (make-instance 'foo:bar))
#<FOO:BAR {10044340C3}>

但是我无法访问成员baz。像这样调用 slot-value ...

CL-USER> (slot-value f 'baz)

...导致此错误消息:

When attempting to read the slot's value (slot-value), the slot
BAZ is missing from the object #<FOO:BAR {10044340C3}>.
   [Condition of type SIMPLE-ERROR]

我已经尝试将 baz 添加到 :export 列表,但这也不起作用。

如何从包中导出插槽和访问器?

最佳答案

您不能导出插槽和访问器。

在 Common Lisp 中,您可以导出符号。

因此,导出命名插槽的符号 BAZ

然后在CL-USER包中:

(slot-value some-instance 'foo:baz)

未导出你必须写:

(slot-value some-instance 'foo::baz)

如果将符号导入包CL-USER:

(slot-value some-instance 'baz)

关于lisp - 如何从 Lisp 类导出槽和访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351443/

相关文章:

lambda - LISP 宏失败,崩溃史莱姆

file - 从 Common Lisp 中的文本文件中读取序列

package - Clisp 找不到包

javascript - 什么是具有以下类型签名的函数 : (x) => (func) => (. ..values) => func(x,...values)

lisp - 构建应用程序和调试器

lisp - .sbclrc 中的运算符 #+ 和 #-

Lisp:防止递归函数的双重调用

common-lisp - 通过 Emacs 离线查看 Common Lisp HyperSpec

math - Project Euler #211 - 效率问题

concurrency - 如何将当前线程的绑定(bind)传递给另一个线程?