Ошибка в конструкции кейса со сравнением строк (схема) - PullRequest
0 голосов
/ 26 ноября 2018
(define aaa ;;val:string  
(lambda(x)  ;;x:string
 (case
    ((string=? (substring x 0 1) "+") (aaa(substring x 1)))
    ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))
    ((char=?(string-ref x 0)#\.) (-404))
    (else
     (if (= (findpoint x) -1)
       "a"
       "b"
    )     
   )
  )  
) 
)

Здравствуйте, у меня проблема с DrRacket: при попытке запустить этот код выдает ошибку:

case: ожидается символ (без кавычек) иличисло в качестве выбора, но нашел строку

со ссылкой на строку (5):

((string =? "a" "b") (string-append ("-" (aaa (substring x 1)))))

Эта строка должна была выглядеть примерно так:

((string =? *)1017 * (подстрока x 0 1) "+" ) (string-append ("-" (aaa (substring x 1)))))

но я подумал, что использую две строки«а» «б» легко выявит проблему.Я не понимаю, почему я получаю эту ошибку, так как оба "a" и "b" являются строками, а не символами или списками, а также я не могу понять, почему я не получаю эту ошибку в предыдущей строке

КОНТЕКСТ: предполагается, что процедура проверяет, является ли первый символ строки символом + / - /., А затем выполняется через рекурсию, используя else (опять же, «a», «b» - примеры)

1 Ответ

0 голосов
/ 26 ноября 2018

Похоже, вы смешиваете cond, flat if-elseif-else и case, что похоже на оператор switch.

Как использовать cond:

(cond ((equal? 1 2) 'consequent)
      ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
      (else 'alternative))    ; or else it evaluates the alterntaive
; ==> consequent2

Против использования case

(case 'value4
  ((value1 value2) 'consequent)
  ((value3 value4) 'consequent2)
  (else 'default))
; ==> consequent2

Теперь этот оператор case является просто сахаром.Ваша реализация Схемы превратит это во что-то похожее на это:

(cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
      ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
      (else 'default))

Таким образом, обратите внимание, что значения для сопоставления в случае обрабатываются так, как будто они заключены в кавычки.Например.Ваши значения не могут быть переменными, так как они будут соответствовать только их символу.

Если вы хотите использовать case, я бы сделал это:

(define (first-letter-operator? str)
  (case (string-ref str 0)
    ((#\+ #\- #\.) #t)
    (else #f)))

(first-letter-operator? "+345634") ; ==> #t
(first-letter-operator? "hello")   ; ==> #f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...