Lisp 使用循环参数高效计算拼接列表

Lisp 使用循环参数高效计算拼接列表,lisp,common-lisp,clos,expression-evaluation,Lisp,Common Lisp,Clos,Expression Evaluation,我想在类的插槽名称列表中重复,两个类的插槽名称相同((当前试用版*exp*)&(以前的*exp*)指的是同一类的实例)。在每个递归中,我想计算插槽名称,以便获取并设置该实例的该插槽的值。下面的代码满足了这个期望,但我担心依赖eval,因为它很慢,并且不允许词汇上下文(Graham,1996)。什么样的替代公式将是有效的,并考虑到词汇上下文 (dolist (a '(letter number font color height)) (eval `(when (eq (,a (curr

我想在类的插槽名称列表中重复,两个类的插槽名称相同(
(当前试用版*exp*)
&
(以前的*exp*)
指的是同一类的实例)。在每个递归中,我想计算插槽名称,以便获取并设置该实例的该插槽的值。下面的代码满足了这个期望,但我担心依赖eval,因为它很慢,并且不允许词汇上下文(Graham,1996)。什么样的替代公式将是有效的,并考虑到词汇上下文

(dolist (a '(letter number font color height))
  (eval 
   `(when (eq (,a (current-trial *exp*)) 
              (,a (previous *exp*)))
     (setf (,a (current-trial *exp*)) 
           (random-not-item 
            (,a (current-trial *exp*)) 
            (,a *exp*))))))

因为这些是插槽名称,所以您可以使用
插槽值

(dolist (a '(letter number font color height))
  (when (eq (slot-value (current-trial *exp*) a) 
            (slot-value (previous *exp*) a))
    (setf (slot-value (current-trial *exp*) a) 
          (random-not-item 
           (slot-value (current-trial *exp*) a) 
           (slot-value *exp* a)))))

为什么要用递归来标记它?它甚至不是一个函数,它怎么可能是递归的?