Это похоже на часть блока COND.Имея это в виду, я добавил обратно COND и переформатировал код, чтобы сделать его немного более очевидным.
(cond ((alpha-char-p (returnFirstCharacter p))
(let () (if (equal p d) (match2 nil nil a) nil)))
((equal (returnFirstCharacter p) #\=)
(let ()
(if (and (returnRestCharacters p)
(null (val (returnRestCharacters p) a)))
(match2 nil nil (cons (list '= (returnRestCharacters p) d) a))
(let ()
(if (and (returnRestCharacters p)
(equal (val (returnRestCharacters p) a)
(car d)))
(match2 (cdr p) (cdr d) a) nil))))))
Во-первых, вы вызываете MATCH2 из хвостовой позиции,так что не очевидно, что вы подразумеваете под «передачей контроля назад к предыдущему совпадению2».Когда произойдет вызов MATCH2, как написано, возвращаемое значение будет просто распространяться по цепочке вызовов, поскольку вы ничего не делаете с возвращаемым значением.
Во-вторых, вы используете пустые блоки LET дляочевидная причина (первый IF вызывает MATCH2, если условие истинно, в противном случае переходит к следующему IF).Ни в том, ни в другом случае у вас нет нескольких выражений, требующих оценки, так что вы могли бы просто пропустить блоки LET.Кроме того, использование PROGN немного более привычно, чем использование пустого блока LET (не имеет значения для компилятора, но имеет значение для читателя).
Вероятно, это поможет, если вы замените сегмент кодавыше с полным определением функции MATCH2 и добавлено «простое английское» описание того, что, по вашему мнению, должно быть сделано.
Редактировать : с опубликованным кодом целиком (и с отвратительным форматированием),в MATCH2 есть только один случай, когда существует концепция «вернись и сделай что-нибудь», и это два вызова, которые являются аргументами для APPEND, в самом конце.Есть по крайней мере один фрагмент кода, который, вероятно, вызовет ошибки во время выполнения (и определенно предупреждения времени компиляции), с =
, используемым в качестве переменной (если в другом месте нет динамического inding, это, вероятно, должно быть '=
).
Вы все еще не объяснили, что должен делать код.Если вы сядете и напишете то, что, как вы ожидаете, будет делать код, в пошаговой манере, возможно, вы поймете, в чем дело.