检查字符串中是否有小写字符
Check are there lowercase characters in string
我需要 return 对或错
True
如果至少有一个小写字符
False
无小写字符
我试过用循环和 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)
.
另一种方法
你已经有了 some
和 loop
的例子,你也可以使用 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 块。
我需要 return 对或错
True
如果至少有一个小写字符False
无小写字符
我试过用循环和 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)
.
另一种方法
你已经有了 some
和 loop
的例子,你也可以使用 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 块。