Lisp Racket:如何获取字符串中字符的出现次数

Lisp Racket:如何获取字符串中字符的出现次数,lisp,racket,Lisp,Racket,我正在尝试获取字符串中某个字符在RACKET中出现的次数 我通过了字符“#\a”,我应该得到3分 我做错了什么 (define (numCaracter character string1) (numCaracter-aux character string1 0 0)) (define (numCaracter-aux c s1 numC x) (cond ((= x (string-length s1)) numC) ((eq? c (string-ref s

我正在尝试获取字符串中某个字符在RACKET中出现的次数

我通过了字符“#\a”,我应该得到3分

我做错了什么

(define (numCaracter character string1)
  (numCaracter-aux character string1 0 0))

(define (numCaracter-aux c s1 numC x)
   (cond
     ((= x (string-length s1)) numC)
     ((eq? c (string-ref s1 x)) (numCaracter-aux c s1 (+ 1 numC) (+ 1 x)))
     (else (numCaracter-aux c s1 numC (+ 1 x))))) 

(numCaracter "#\a" "banana")

您的代码有两个问题:

  • “#\a”
    是字符吗
  • 你应该如何比较角色之间的差异
第二点是一个微妙而重要的观点。
eq?
所做的是告诉您两个对象是否实际上是相同的对象。但也可能有你称之为“相同”的对象,实际上它们不是相同的对象。一个很好的例子是数字:显然
(等式11)
应该是正确的。但是呢

(define (big n m)
  (for/product ([e (in-range 1 n)])
    (* e m)))

(eq? (big 100 123) (big 100 123))
(大100 123)
7423516654806326813615745079595229402198631079266680195649980914217025866513150270412210373478739641728942304596242628528306658838091912019448210032028630508508871608854577295086687907437878808394400070888253201145858328788383302617001254136981433800689678787878787878255613579482679267966512366368686868464848486868686868686868686868686868686868686868684848484848486868686868686868686868686868686868686868686868686868686868686800000000000000
。这个数字太大了,机器无法表示:它大约有1200位。每次创建这个数字时,都会在内存中创建一些大型结构,通常这些结构是不同的对象。所以当比较两个这样的数字时,
eq?
返回
#f
,或者几乎可以肯定是这样

但我想将它们视为同一事物,并且(以及数字的专用谓词),如果两个不可变对象在语义上相同,则有一个谓词返回true。该谓词是
eqv?

对于角色来说,这一点可能并不明显,但事实确实如此。这是因为字符通常不是小对象:它们可以是完全成熟的Unicode对象,也可以是相当大的对象。因此,同样,
eqv?
对字符做了正确的处理

然而,您可能只想使用一个谓词,其目的是比较字符,这不仅有效,而且会为您捕获其他错误


最后:你可以修改你的代码,让它向后遍历字符串:为什么这会使它更简单?

在你的回答之后,我明白我做错了什么。我只是为
\a
@PedroFerreira更改了
“\a”
:如果这是您所做的唯一更改,它将适用于某些字符串。例如,试试
(Numcarracter#ūderūre,heofnum上的eart)