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

fpt*_*fpt 3 lisp common-lisp expression-evaluation clos

我想重复一下类的插槽名称列表,两个类的插槽名称相同((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*))))))
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 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)))))
Run Code Online (Sandbox Code Playgroud)