使用重复参数有效评估拼接列表

时间:2013-08-23 18:17:37

标签: lisp common-lisp clos expression-evaluation

我想重复一下类的插槽名称列表,两个类的相同插槽名称((current-trial *exp*)& (previous *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*))))))

1 个答案:

答案 0 :(得分:5)

由于这些是插槽名称,因此您可以使用slot-value

(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)))))