Search code examples
lispcommon-lispclisp

Adapting UCI lisp function with a loop to common lisp


I'm currently trying to recreate an old program written in UCI Lisp using Common lisp but I'm not very fluent with Lisp.

The original function is:

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

Here's my common lisp interpretation:

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

This is the error that comes up:

*** - EVAL: variable WHEN has no value

My initial thinking is that there is no equivalent 'save' function. The description of the function is:

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

Kindly help, I'm stumped


Solution

  • I found the bug. There was a loose 'when' in the wild below the code.