在Racket中,如何使用String句子并创建一个由该句子中每个单词组成的String列表?

时间:2019-06-18 04:50:01

标签: string list racket

基本上,我只想使用DrRacket / Scheme将字符串句子转换为单个字符串词的列表。我目前在Lambda上使用中级学生,因此可能会限制我可以使用的某些功能,但可以提供任何帮助。例如我想要

(split-string "the man over there is close") to yield

(list "the" "man" "over" "there" "is" "close")

2 个答案:

答案 0 :(得分:0)

这个问题有点棘手。对于初学者,您需要将输入字符串视为字符列表。每次遇到空格,我们都知道一个新词是完整的。

我们可以跟踪变量中的当前单词,并使用累加器来存储整个单词,请注意不要反转中间值,因为我们会cons对其进行设置,以便它们进入相反。这就是我的意思:

(define (split-string lst)
  (let loop ((acc '()) (current '()) (chars (string->list lst)))
    (cond ((null? chars)
           (reverse (cons (list->string (reverse current)) acc)))
          ((char=? (car chars) #\space)
           (loop (cons (list->string (reverse current)) acc)
                 '()
                 (cdr chars)))
          (else
           (loop acc
                 (cons (car chars) current)
                 (cdr chars))))))

它按预期工作:

(split-string "the man over there is close")
=> '("the" "man" "over" "there" "is" "close")

答案 1 :(得分:0)

尾呼叫递归版本

用于单字符分隔符。

(define (split-string s (sep #\space))
  (define (rec-split sl sep (acc '()) (h-acc '()))
    (cond ((empty? sl) (reverse (map (lambda (isl) (list->string isl))
                                     (cons (reverse h-acc) acc))))
          ((char=? (car sl) sep) (rec-split (cdr sl) sep (cons (reverse h-acc) acc) '()))
          (else (rec-split (cdr sl) sep acc (cons (car sl) h-acc)))))
  (rec-split (string->list s) sep))
> (split-string "the man over there is close")
;; '("the" "man" "over" "there" "is" "close")