gpt4 book ai didi

LISP--传递一个结构组件,而不是组件的值

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:20 24 4
gpt4 key购买 nike

我在 LISP 中传递结构的组件时遇到问题。我想传递组件,而不是组件的值。

为了说明我的目标,假设我有一个结构实例 node。 Node 具有组件 farmerfoxgoosestraw。我希望函数具有灵 active ,这样我就可以将这些组件中的任何一个传递给函数。

(defun pass-comp (node object)
(setf object 1)
node)

(pass-comp (node (node-fox node))
(write (node-fox node))
—> 1

最佳答案

在 Lisp 中,所有参数总是按值传递。如果要修改传递的结构的内容,可以通过指定要修改的内容来实现:

(defstruct node farmer fox goose straw)
(defparameter *node* (make-node :fox 3))
(defun change-slot (object slot-name new-value)
(setf (slot-value object slot-name) new-value))
(change-slot *node* 'fox 7)
(change-slot *node* 'goose 23)
*node*
==> #S(NODE :FARMER NIL :FOX 3 :GOOSE 23 :STRAW NIL)

请注意,即使标准要求 slot-value继续工作 structure-object , 这以上代码适用于所有 CL 实现。

如果您希望代码为 conforming ,你应该传递一个setter:

(defun change-slot (object setter new-value)
(funcall setter new-value object))
(change-slot *node* #'(setf node-farmer) 6)
*node*
==> #S(NODE :FARMER 6 :FOX 3 :GOOSE 23 :STRAW NIL)

唉,这也不能保证有效 because :

it is implementation-dependent whether the ability to write the slot is implemented by a setf function or a setf expander.

因此您需要创建自己的 setter:

(change-slot *node* (lambda (straw node) (setf (node-straw node) straw)) 11)
*node*
==> #S(NODE :FARMER 6 :FOX 3 :GOOSE 23 :STRAW 11)

关于LISP--传递一个结构组件,而不是组件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52799097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com