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)))))
为什么要用递归来标记它?它甚至不是一个函数,它怎么可能是递归的?