方案大写控制

Scheme UpperCase Control

我正在尝试检查某个元素是否为大写,但我遇到了一些错误

(define (isUpper lst)
  (if (null? (car lst))
  #f
  (if (char-lower-case? (car lst)) #t
           (isUpper (cdr lst)))
  ))
(isUpper '(a s f t r 5 q))

错误; char-lower-case?: 需要一个字符,给定 'a

提前致谢

您的字符列表实际上是一个符号列表(和一个数字)。字符前面写有 #\

;; In Lisps the custom is to use dashes between words instead of camelCase
(is-upper '(#\a #\s #\f #\t #\r # #\q))

函数本身好像有两个问题。 1) 第一个 if 应该检查整个 lst 是否为空,而不是检查第一个元素是否为空。 2) 你应该使用 char-upper-case? 作为内部 if.

的谓词
(define (is-upper lst)
  (if (null? lst)
      #f
      (if (char-upper-case? (car lst)) 
          #t
          (is-upper (cdr lst)))))

因为你有三个分支,使用 cond 而不是嵌套的 if.

会更清楚
(define (is-upper lst)
  (cond
    ((null? lst) #f)
    ((char-upper-case? (car lst)) #t)
    (else (is-upper (cdr lst)))))

(is-upper '(#\a #\b #\c))
;=> #f
(is-upper '(#\a #\B #\c))
;=> #t