Без правильного отступа и форматирования кода вы не должны писать ни кода, ни кода на Лиспе.С Lisp у вас также нет никаких оправданий, потому что IDE сделает отступ для вас.
Исправлено отступ:
(defun compute-applicable-methods (gf &rest args)
(loop for method in (generic-function-methods gf)
do (loop for specializer in (method-specializer method)
for arg in args
counting (instancep arg specializer) into matched_args
)
when (= matched_args (count args)
collect method ) ))
Тем не менее код странно отформатирован.Улучшения:
(defun compute-applicable-methods (gf &rest args)
(loop for method in (generic-function-methods gf)
do (loop for specializer in (method-specializer method)
for arg in args
counting (instancep arg specializer) into matched_args)
when (= matched_args (count args)
collect method)))
Первое, что вы видите, что функция =
не имеет правильного списка аргументов.collect
и method
не должны быть аргументами для =
:
(defun compute-applicable-methods (gf &rest args)
(loop for method in (generic-function-methods gf)
do (loop for specializer in (method-specializer method)
for arg in args
counting (instancep arg specializer) into matched-args)
when (= matched-args (count args))
collect method))
Внутренний LOOP
не возвращает никакого значения, и вы учитываете локальную переменную matched-args
, которую вы не 't use.
Если вы не используете переменную, давайте удалим ее:
(defun compute-applicable-methods (gf &rest args)
(loop for method in (generic-function-methods gf)
do (loop for specializer in (method-specializer method)
for arg in args
count (instancep arg specializer))
when (= matched-args (count args))
collect method))
Теперь внутренний LOOP
возвращает значение, но мы его не используем.Улучшение:
(defun compute-applicable-methods (gf &rest args)
(loop for method in (generic-function-methods gf)
for matched-args = (loop for specializer in (method-specializer method)
for arg in args
counting (instancep arg specializer))
when (= matched-args (count args))
collect method))