- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在常见的 lisp 中,我可以使用什么来使用插槽名称/符号访问结构插槽?
我想要的是
(defstruct point (x 0) (y 0))
(defmacro -> (struct slot) `(slot-value ,struct ,slot))
(setf p (make-point))
(setf (slot-value p 'x) 1)
(setf (-> p 'y) 2)
slot-value
对于结构,或者有更好的方法吗?
最佳答案
通常你会使用带有结构的访问器函数。
您的代码定义了访问函数 point-x
和 point-y
.你可以使用那些。
您也可以使用SLOT-VALUE
具有支持它的实现结构。我想这是大多数实现(GCL 将是一个异常(exception))。有 Lisp 软件假定 SLOT-VALUE
适用于结构。我认为实现不会取消对它的支持。它不在标准中,因为一些实现者不想在已部署的应用程序中提供此功能。
所以两种方式都可以。
如果您想使用短名称,请使用访问器:
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 类,提供元对象协议(protocol),...
关于common-lisp - 常见的 lisp : slot-value for defstruct structures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17247540/
在 CLHS 中,我为 :read-only x 读到:“当 x 为真时,这指定不能更改此插槽;它将始终包含构造时提供的值。” 我可以做到这一点(CCL、SBCL): CL-USER> (defstr
我想将数据保存到文件中,并在重新运行程序时恢复数据。 我已经这样定义了我的 defstruct: (defstruct书签:url:标题:评论) 程序将简单地执行以下操作: 1. 从 url-db.t
是否可以像函数一样定义结构的槽之一并访问槽以使用该函数?如果是,如何使用它?例如,像这样: (defstruct problem state (player (defun getplaye
在普通的 lisp 中,我注意到我可以这样写: (defun foo (&key (a 1) (b 2) (c (+ a b))) (print (+ a b c))) 当我打电话时 (foo) ,
我正在尝试将 defstruct 的实例嵌套为另一个 defstruct 中的一些 &key 参数,如下面的代码所示。出于某种原因,要插入外部 defstruct 的变量不会被绑定(bind)到它们的
我在 Lisp 中定义了一个非常简单的数据结构: ;;Data structure for a person (defstruct person (name nil) (age 0) (s
我正在尝试调整此 defstruct例如,添加本书中描述的 select- 函数:Practical Common Lisp .我使用 Common Lisp 包在 Emacs 中运行代码。 sele
我正在尝试调整此 defstruct例如,添加本书中描述的 select- 函数:Practical Common Lisp .我使用 Common Lisp 包在 Emacs 中运行代码。 sele
我正在自学 Common Lisp。我一直在看康威生命游戏的例子,有一段语法我不明白。 完整代码可用here .我特别遇到问题的部分如下: (defstruct (world (:constructo
ClojureScript 不支持 defstruct - 这似乎是设计使然。现在这可能实际上是 Clojure 语言中已弃用的部分,ClojureScript 的设计者只是希望每个人都继续前进。 (
问题:如何为析构(以及实例)的嵌套槽值编写通用访问器宏? 动机:我是一名 LISP 程序员,羡慕 Python 等中的“点符号”,其中嵌套槽访问距离只有几个点 用例:我想做的是 (print (??
是否有比以下更简单的方法来测试符号是否是结构的名称: (fboundp 'make-symbol) 最佳答案 (defun symbol-names-structure-p (symbol) (l
在常见的 lisp 中,我可以使用什么来使用插槽名称/符号访问结构插槽? 我想要的是 (defstruct point (x 0) (y 0)) (defmacro -> (struct slo
假设我们有上面的代码: (require-extension defstruct) (defstruct tree height age leaf-color) (define coconut (
我了解如何使用 @type 指令来定义用户定义的类型。到目前为止,我只在函数规范中遇到过它的用法。我很想知道它的用法是否可以扩展到结构,使参数与其数据类型之间存在紧密耦合。 我开始探索一个示例程序。
我是一名优秀的程序员,十分优秀!