Bitte verwenden Sie Standardformatierung und Benennung:
Wenn Sie die Alternative in einer if
nicht benötigen, verwenden when
:
(defun printo (x y z)
(when (and x y z)
(format t "~a and ~a difference: ~a ~%" x y z)))
(defun get-diff (x y)
(return-from get-diff (abs (- x y))))
(defun distcalc (lista)
(loop for k from 0 to (list-length lista)
do (loop for j from 0 to (list-length lista)
do (let ((pivot (nth k lista))
(base (nth j lista)))
(when (nth j lista)
(printo pivot base (abs (- base pivot))))))))
(distcalc '(1 10 20 25 13))
Sie tun nicht brauchen return
oder return-from
; Ein Funktionskörper gibt die Werte des letzten Formulars zurück. Ich denke, dass Sie Ihre get-diff
verwenden möchten:
(defun printo (x y z)
(when (and x y z)
(format t "~a and ~a difference: ~a ~%" x y z)))
(defun get-diff (x y)
(abs (- x y)))
(defun distcalc (lista)
(loop for k from 0 to (list-length lista)
do (loop for j from 0 to (list-length lista)
do (let ((pivot (nth k lista))
(base (nth j lista)))
(when (nth j lista)
(printo pivot base (get-diff base pivot)))))))
(distcalc '(1 10 20 25 13))
Der Fehler ist, dass Looping to
das Ende enthält; Sie wollen below
:
(defun printo (x y z)
(when (and x y z)
(format t "~a and ~a difference: ~a ~%" x y z)))
(defun get-diff (x y)
(abs (- x y)))
(defun distcalc (lista)
(loop for k from 0 below (list-length lista)
do (loop for j from 0 below (list-length lista)
do (let ((pivot (nth k lista))
(base (nth j lista)))
(when (nth j lista)
(printo pivot base (get-diff base pivot)))))))
(distcalc '(1 10 20 25 13))
Allerdings müssen Sie die Indizes überhaupt nicht benötigen, so können Sie einfach Schleife über die Liste:
(defun printo (x y z)
(when (and x y z)
(format t "~a and ~a difference: ~a ~%" x y z)))
(defun get-diff (x y)
(abs (- x y)))
(defun distcalc (lista)
(loop for pivot in lista
do (loop for base in lista
when base
do (printo pivot base (get-diff base pivot)))))
(distcalc '(1 10 20 25 13))
können wir jetzt vielleicht besser sehen, dass alle nil
s in lista
wäre auch ein Problem in der äußeren Schleife sein:
(defun printo (x y z)
(when (and x y z)
(format t "~a and ~a difference: ~a ~%" x y z)))
(defun get-diff (x y)
(abs (- x y)))
(defun distcalc (lista)
(loop for pivot in lista
when pivot
do (loop for base in lista
when base
do (printo pivot base (get-diff base pivot)))))
(distcalc '(1 10 20 25 13))
Darn, danke für die ausführliche Antwort, das hilft sicherlich mit meinem Lisp! –
Es tut mir leid, wieder zu schreiben, aber wenn ich versuche, die Unterschiede zu sammeln, gibt der Befehl collect keine Liste aus. Was könnte hier falsch sein? –
@sdgawerzswer vielleicht eine neue Frage stellen, mit dem aktualisierten Code und dem neuen Problem? –