Memory 高效返回变异结构

Memory 高效返回变异结构,memory,lisp,structure,common-lisp,Memory,Lisp,Structure,Common Lisp,我有一个结构: (defstruct spider omegas values continuation) 我有一些函数接受这个结构并返回它的一个变异版本: (defun dec (s) (make-spider :omegas (spider-omegas s) :values (cons (- (car (spider-values s)) 1) (cdr (spider-values s))) :continuation (cdr (spider-contin

我有一个结构:

(defstruct spider omegas values continuation)
我有一些函数接受这个结构并返回它的一个变异版本:

(defun dec (s)
  (make-spider
    :omegas (spider-omegas s)
    :values (cons (- (car (spider-values s)) 1) (cdr (spider-values s)))
    :continuation (cdr (spider-continuation s))))

我有一种预感,这是在内存中创建新的spider实例,它不需要在内存中,google也没有帮助。我关心的是我返回的是它自己的内存块,但我不关心在我完成函数时作为参数s的爬行器。有没有一种更平滑的方法可以返回这样的结构?

如果您只想改变参数结构对象:

(defun dec (s)
  (decf (first (spider-values s)))  ; mutates the list of values
  (pop (spider-continuation s))
  s)

如果您只想改变参数结构对象:

(defun dec (s)
  (decf (first (spider-values s)))  ; mutates the list of values
  (pop (spider-continuation s))
  s)

你怎么知道它正在创建新的spider实例?我不知道。如果可以回答这个问题,那么也可以适当地回答当前的问题。我试过谷歌也没用。我的大脑确信它们是新的复制品,但它确实在创造一个新的实例。从某种理论上讲,它可能不是:如果一个非常英勇的编译器能够证明旧实例无法访问,我想它可以重用旧实例,但我认为这是难以置信的英勇。你怎么知道它正在创建新的spider实例?我不知道。如果可以回答这个问题,那么也可以适当地回答当前的问题。我试过谷歌也没用。我的大脑确信它们是新的复制品,但它确实在创造一个新的实例。从某种理论上讲,它可能不是:如果一个非常英勇的编译器可以证明旧实例是不可访问的,我想它可以重用旧实例,但我认为这是难以置信的英勇。谢谢。我忽略了一个事实,即您可以将s单独写为语句,从函数返回它。@Stegosaurus:或更少使用:从dec返回s@Stegosaurus:没有语句:Lisp是一种表达式语言。函数的值是函数体中最后一个表达式的值,在本例中,它是绑定到s的值,s是作为参数传递给函数的结构。谢谢。我忽略了一个事实,即您可以将s单独写为语句,从函数返回它。@Stegosaurus:或更少使用:从dec返回s@Stegosaurus:没有语句:Lisp是一种表达式语言。函数的值是函数体中最后一个表达式的值,在本例中,它是绑定到s的任何表达式,s是作为参数传递给函数的结构。