检查字符串中是否有小写字符

Check are there lowercase characters in string

我需要 return 对或错

我试过用循环和 lambda 函数来做 像这样

(defun check-lower-word (word)
    (loop
        for ch across word 
        ((lambda (c) (if (lower-case-p c) return T) ch)
    )
)

如果从未工作过,我需要 False "if"

我是这样做的

(defun check-lower-word (word)
    (block outer
        (loop
            for ch across word do
                (if (lower-case-p ch) (return-from outer T))
        )
    )
)

使用预定义函数,您可以使用 some (manual):

CL-USER> (some #'lower-case-p "AbC")
T
CL-USER> (some #'lower-case-p "ABC")
NIL

loop语法(manual)也有类似的操作:

CL-USER> (loop for x across "AbC" thereis (lower-case-p x))
T
CL-USER> (loop for x across "ABC" thereis (lower-case-p x))
NIL

最后,请注意 loop 总是 returns nil 当迭代终止时没有产生结果,因此 loop 的不太简洁的用法可能是:

CL-USER> (loop for x across "AbC" if (lower-case-p x) do (return t))
T
CL-USER> (loop for x across "ABC" if (lower-case-p x) do (return t))
NIL

代码错误

您的代码在括号方面不平衡,末尾缺少右括号:

(defun check-lower-word (word)
    (loop
        for ch across word 
        ((lambda (c) (if (lower-case-p c) return T) ch)
    )
) ; <-- closes "(loop"

你的loop里面的语法错误应该是报错了,直接在(loop for c across w EXPR)里面写一个表达式EXPR是没有意义的,前面应该有do.

字面量((lambda (c) E) ch)可以直接写成E,其中变量c的每一次出现都被ch代替,即:

(if (lower-case-p ch) return T)

中间文字 lambda 的使用在这里没有任何意义。

还有,上面写成:如果ch是小写,if的值就是return变量绑定的值,否则就是T。您确实缺少 (return T) 周围的括号。 "one-armed" (if T X) 最好写成 (when T X).

另一种方法

你已经有了 someloop 的例子,你也可以使用 short-circuiting map:

(defun check-lower-word (word)
  (block nil
    (map ()
         (lambda (c)
           (when (lower-case-p c)
             (return t)))
         word)))

nil 作为第一个参数对 MAP 的调用意味着序列被迭代以获得效果并且 return 为零。对于序列(列表或向量)中的每个字符,当字符为 lower-case、return T 时。return 提前退出迭代,直到 NIL 块。