使带有循环的 UCI lisp 函数适应 common lisp

Adapting UCI lisp function with a loop to common lisp

我目前正在尝试使用 Common lisp 重新创建一个用 UCI Lisp 编写的旧程序,但我对 Lisp 不是很流利。

原函数为:

(DE SETROLE (ROLE FILLER CD)
  (CONS (HEADER:CD CD)
        (APPEND (FOR (PAIR IN (ROLES:CD CD))
                    (WHEN (NOT (EQUAL (ROLE:PAIR PAIR) ROLE)))
                    (SAVE PAIR))
                (LIST (LIST ROLE FILLER]

这是我对 lisp 的常见解释:

(defun setrole (role filler cd)
 (cons (header/cd cd)
    (append (loop for pair in (roles/cd cd)
                do (when (not (equal (role/pair pair) role))
                (save pair)))
            (list (list role filler)))))

这是出现的错误:

*** - EVAL: variable WHEN has no value

我最初的想法是没有等效的 'save' 函数。函数的描述是:

SETROLE Makes a new CD form with (ROLE FILLER) added or replacing the old (ROLE ...) pair.

请帮忙,我很困惑

我发现了这个错误。代码下面有松散的'when'.