Scheme 方案大写控制

Scheme 方案大写控制,scheme,Scheme,我试图检查一个元素是否为大写,但我有一些错误 (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)) 错误; 字符小写?:需要一个字符,给定“a” 提前感谢您的字符列表实际上是一个符号列表(和一个数字)。字符前面写有\: ;; In Lisps t

我试图检查一个元素是否为大写,但我有一些错误

(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))
错误; 字符小写?:需要一个字符,给定“a”


提前感谢

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

;; In Lisps the custom is to use dashes between words instead of camelCase
(is-upper '(#\a #\s #\f #\t #\r #\5 #\q))
函数本身似乎有两个问题。1) 第一个
if
应该检查整个
lst
是否为空,而不是检查第一个元素是否为空。2) 您应该使用
char大写?
作为内部
if
的谓词

(define (is-upper lst)
  (if (null? lst)
      #f
      (if (char-upper-case? (car lst)) 
          #t
          (is-upper (cdr lst)))))
(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
因为您有三个分支,所以使用
cond
而不是嵌套的
if
会更清晰

(define (is-upper lst)
  (if (null? lst)
      #f
      (if (char-upper-case? (car lst)) 
          #t
          (is-upper (cdr lst)))))
(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

确定一下:您想检查列表中是否至少有一个元素是大写字符,或者所有元素都是大写字符?