读取字符串并使用scheme计算元音数

读取字符串并使用scheme计算元音数,scheme,racket,Scheme,Racket,编写一个名为count_元音的过程,计算任意给定字符串中的元音数(a、e、i、o、u) 到目前为止,我有这个 (define (count_vowel (str) (char-set-fold (count_vowel (ch i) (if (vowel? ch) (+ i 1) i)) 0 str)) 但是我得到了这个错误。。。 “#%plain lambda:不是:(str)中的标识符” 我需要使用带有R5RS的DrRacket作为语言。试试这个: (d

编写一个名为count_元音的过程,计算任意给定字符串中的元音数(a、e、i、o、u)

到目前为止,我有这个

 (define (count_vowel (str)
                 (char-set-fold (count_vowel (ch i) (if (vowel? ch) (+ i 1) i)) 0 str))
但是我得到了这个错误。。。 “#%plain lambda:不是:(str)中的标识符”

我需要使用带有R5RS的DrRacket作为语言。

试试这个:

(define (count-vowel str)
    (char-set-fold (lambda (ch i) 
                       (if (vowel? ch) 
                           (+ i 1)
                           i))
                   0 (string->char-set str)))

您的
定义
错误

应该是:

(define (count_vowel str)
   .... )

在原始解决方案中,请注意第二行的缩进是错误的。每当缩进错误时,就表明某个地方有括号错误。其他答案指出了确切的错误

由于
char set fold
是一个srfi函数,我认为这是一个纯粹的R5RS解决方案 这是正常的。我错误地认为,
filter
是R5R的一部分,因此 下面是一个简短的解决方案。原来,
过滤器
不是R5RS的一部分

#lang r5rs

(define vowels (string->list "aeiouyæøå"))

(define (vowel? c)
  (member c vowels))

(define (filter p xs)
  (define (more) (filter p (cdr xs)))
  (cond
    ((null? xs)    '())
    ((p (car xs))  (cons (car xs) (more)))
    (else          (more))))


(define (count-vowels s)
  (length (filter vowel? (string->list s))))

(display (count-vowels "foobarbaz"))
(newline)

我会把最后一个参数放在一个换行符上以保持一致:)好的,这是有意义的,那么为什么我不能再次调用(count_元音“”)函数来测试另一个工作呢?它告诉我它是未定义的;无法引用未定义的标识符?当我这样做(显示(计数元音“code”))时它会工作,因此为了检查另一个字符串,我需要进行显示?我在名称
计数元音
中使用了
-
而不是
。在REPL中,您只需编写
(count votels“”)
,但如果将其放入程序中,则
#lang r5rs
不会自动打印结果。这就是我插入显式显示的原因。