2016-11-05 3 views
0

Я пытаюсь скомпилировать следующий код:получения неопределенной ссылки на функцию в commonLISP

(defun nextStates (st) 
    "generate all possible states" 
    (setf N 0) 
    (setf states-list (make-list 9)) 
    (setf list-actions (possible-actions)) 

    (loop for x in list-actions do 

    (setf aux (nextState st x)) 
    (when (not(member aux (states-list) :test #'equalp)) 
     (progn 
      (setf (nth N states-list) aux) 
      (setf N (+ N 1)) 
     ) 
    ) 
) 

    (values states-list) 
) 

nextState является функцией и состояния, список представляет собой список, оба из которых определены. Я получаю «неопределенную ссылку на список состояний». Я не знаю, что я делаю неправильно. Любая помощь будет принята с благодарностью

+0

ли Вы забыли 'do'? – Sylwester

+0

@Sylwester Я пытался, но он не компилировался. Как я могу поместить несколько операторов внутри? –

+0

Он должен принимать несколько форм. Например. '(цикл: для var: in list: do expr1 expr2 ...)'. Если у вас нет предложения then, вы должны '(когда (not (member ...) expr1 expr2 ...)' – Sylwester

ответ

1

Переименование плохого верблюжьего чехла для случая lisp. Я остался с этим.

(defun next-states (st) 
    "generate all possible states" 
    (loop :for action :in (possible-actions) 
     :for aux := (next-state st action) :then (next-state st action) 
     :when (not (member aux states-list :test #'equalp)) 
      :collect aux :into states-list 
     :finally (return states-list))) 

В качестве теста, вот что я имел:

(defun possible-actions() 
    "have duplicates to see not member in action" 
    '(0 1 3 3 4)) 

(defun next-state (st action) 
    "Simple version for test" 
    (+ st action)) 

(next-states 3) ; ==> (3 4 6 7) 
Смежные вопросы