球拍错误:需要一个非空列表,但给定为空

时间:2019-10-12 23:05:35

标签: racket

我正在编写一个程序,要求我将str中的所有大写字母都转换为小写,并将小写字母转换为大写,并且所有其他字符保持不变。 下面是我的代码:

(define (switch-case str)
  (list->string (switch-char (string->list str))))

(define (switch-char loc)
   (cons
    (cond
      [(empty? (first loc)) empty]
      [(char-lower-case? (first loc)) (char-upcase (first loc))]
      [(char-upper-case? (first loc)) (char-downcase (first loc))]
      [else (first loc)]) (switch-char (rest loc))))

(开关箱“ ABC”)的错误消息是:

  

first:需要一个非空列表;给定:空

有人可以帮我吗?我不知道代码的哪一部分是错误的:(

1 个答案:

答案 0 :(得分:1)

您的代码中存在几个语法错误。我建议您花更多时间研究Scheme的基本语法,以及如何构造递归过程。请注意:

  • 开头的cons不应该存在。
  • 基本情况是错误的,您应该要求(empty? loc)
  • 最后一种情况不正确,这不是使用else的方式。
  • 最严重的错误:您在所有情况下都忘记调用递归。 这就是cons发挥作用的地方!

此版本解决了上述所有问题:

(define (switch-char loc)
  (cond
    [(empty? loc) empty]
    [(char-lower-case? (first loc))
     (cons (char-upcase (first loc)) (switch-char (rest loc)))]
    [(char-upper-case? (first loc))
     (cons (char-downcase (first loc)) (switch-char (rest loc)))]
    [else (cons (first loc) (switch-char (rest loc)))]))