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)
由于这些是插槽名称,您可以使用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)