带有字符串比较的案例构造错误(方案)

时间:2018-11-26 18:34:54

标签: scheme

(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”是示例)

1 个答案:

答案 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