В Racket, как мне использовать строковое предложение и создать список String, который состоит из каждого слова в этом предложении? - PullRequest
0 голосов
/ 18 июня 2019

По сути, я просто хочу преобразовать строковое предложение в список отдельных строковых слов, используя DrRacket / Scheme. В настоящее время я использую Intermediate Student с Lambda, чтобы ограничить некоторые функции, которые я могу использовать, но любая помощь будет принята с благодарностью. Например, я хочу

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

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

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

рекурсивная версия Tail call

для разделителей из одного символа.

(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")
0 голосов
/ 18 июня 2019

Эта проблема немного сложнее.Для начала вам нужно думать о входной строке как о списке символов.Каждый раз, когда встречается пробел, мы знаем, что новое слово завершено.

Мы можем отслеживать текущее слово в переменной и использовать аккумулятор для хранения целых слов, стараясь обратить вспять промежуточные значенияпотому что мы будем 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")
...