(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 =?(substring x 0 1)“ +” )(string-append(“-”(aaa(substring x 1)))))
但是我认为使用两个字符串“ a”和“ b”会更容易发现问题。 我不明白为什么会收到此错误,因为“ a”,“ b”都是字符串,而不是符号或列表,而且我也无法理解为什么在上一行中没有收到此错误
上下文: 应该假设该过程检查字符串的第一个字符是否为+ /-/,然后使用else通过递归执行操作(同样,“ a”,“ b”是示例)
答案 0 :(得分:0)
似乎您正在混用cond
,平面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
现在,该案例陈述只是糖。您的Scheme实现将使它类似于以下内容:
(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