Похоже, вы смешиваете 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