Ошибка ракетки: ожидает непустой список, но пустой - PullRequest
0 голосов
/ 13 октября 2019

Я пишу программу, в которой предлагается преобразовать все заглавные буквы в 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 Ответ

1 голос
/ 13 октября 2019

В вашем коде есть несколько синтаксических ошибок. Я бы посоветовал вам уделять больше времени изучению основного синтаксиса 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)))]))
...