Ошибки кода
Ваш код не сбалансирован относительно скобок, в конце отсутствует закрывающая скобка:
(defun check-lower-word (word)
(loop
for ch across word
((lambda (c) (if (lower-case-p c) return T) ch)
)
) ; <-- closes "(loop"
Синтаксическая ошибка в вашем loop
должна была вызвать ошибку, нет смысла писать выражение EXPR
непосредственно в (loop for c across w EXPR)
, должно быть предшествующее do
.
Литерал ((lambda (c) E) ch)
может быть непосредственно записан как E
, где каждый вхождения переменной c
заменяется на ch
, а именно:
(if (lower-case-p ch) return T)
Использование промежуточной буквальной лямбды здесь ничего не дает.
Кроме того, приведенное выше читается как: , если ch
в нижнем регистре, значение if - это значение, связанное с переменной return
, в противном случае это T . Вы действительно пропускаете парены около (return T)
. «Однорукий» (if T X)
лучше всего записать как (when T X)
.
Другой подход
У вас уже есть пример с some
и loop
, вы также можете использовать короткое замыкание map
:
(defun check-lower-word (word)
(block nil
(map ()
(lambda (c)
(when (lower-case-p c)
(return t)))
word)))
Вызов MAP
с nil
в качестве первого аргумента означает, что последовательность повторяется для эффектов и возвращает ноль. Для каждого символа в последовательности (список или вектор), когда символ в нижнем регистре, возвращают T. return
выходит из итерации раньше, до блока NIL.