Не зацикливайся, повторяйся!(Common Lisp) - PullRequest
0 голосов
/ 08 февраля 2019

У меня проблемы с переключением на итеративную версию некоторого кода цикла:

(defun get-bound-?vars-1 (tree)
  (loop for item in tree
        when (consp item)
          if (member (car item) '(exists forall doall))
            nconc (delete-if-not #'?varp
                    (alexandria:flatten (second item)))
            else nconc (get-bound-?vars item)))

Мой соответствующий итерационный перевод:

(defun get-bound-?vars-2 (tree)
  (iter (for item in tree)
        (when (consp item)
          (if (member (car item) '(exists forall doall))
            (nconc (delete-if-not #'?varp
                     (alexandria:flatten (second item))))
            (nconc (get-bound-?vars item))))))

Как тестовый пример:

(defparameter *tree* 
  '(if (exists (?t transmitter)
         (and (connecting ?t ?connector)
              (bind (color ?t $hue))))
     (if (not (exists ((?t1 ?t2) transmitter)
                (and (connecting ?t1 ?connector)
                     (connecting ?t2 ?connector)
                     (bind (color ?t1 $hue1))
                     (bind (color ?t2 $hue2))
                     (not (eql $hue1 $hue2)))))
       (activate-connector! ?connector $hue))))

Тогда цикл OK:

(get-bound-?vars-1 *tree*) => (?T ?T1 ?T2)

Но итерация не ОК:

(get-bound-?vars-2 *tree*) => NIL

Спасибо за любые указатели.

...