基本上,我只想使用DrRacket / Scheme将字符串句子转换为单个字符串词的列表。我目前在Lambda上使用中级学生,因此可能会限制我可以使用的某些功能,但可以提供任何帮助。例如我想要
(split-string "the man over there is close") to yield
(list "the" "man" "over" "there" "is" "close")
答案 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")