Как превратить список строк в одну строку в схеме?

Например, у меня есть (list "a" "1" "b" "2" "c" "3").

Теперь я хочу превратить этот список в один "a1b2c3".

Как это сделать?

Спасибо.

Ответ 1

(apply string-append (list "a" "1" "b" "2" "c" "3")) или (string-append* "" (list "a" "1" "b" "2" "c" "3")) должны работать. См.: http://docs.racket-lang.org/reference/strings.html

Если вам нужна процедура для этого, вы можете просто написать (define (strings->string sts) (apply string-append sts))

Ответ 2

Не изобретайте велосипед! в Racket существует одна процедура специально для этого и ее "называется string-join:

(string-join '("a" "1" "b" "2" "c" "3") "")
=> "a1b2c3"

Цитирование документации:

(string-join strs                
             [sep                
              #:before-first before-first                
              #:before-last before-last              
              #:after-last after-last]) → string?

strs : (listof string?)
sep : string? = " "
before-first : string? = ""
before-last : string? = sep
after-last : string? = ""

Добавляет строки в strs, вставляя sep между каждой парой строк в strs. before-last, before-first и after-last аналогичны входам add-between: они задают альтернативный разделитель между двумя последними строками, префиксной строкой и строкой суффикса соответственно.

Ответ 3

Для чего это стоит, вот некоторые реализации с разделителем и без него (т.е. Строка, которая вставляется между каждой парой строк, таких как пробел или запятая).

Функции fold и fold-right Right взяты из SRFI 1.

Использование строкового порта, вероятно, быстрее при объединении очень многих или очень длинных строк. Иначе вряд ли будет большая разница в скорости.

Без аргумента разделителя

Используя сгиб

(define (string-join strings)
  (fold-right string-append "" strings))

Использование рекурсии

(define (string-join strings)
  (let loop ((strings strings) (so-far ""))
    (if (null? strings)
        so-far
        (loop (cdr strings) (string-append so-far (car strings))))))

Использование строкового порта

(define (string-join strings)
  (parameterize ((current-output-port (open-output-string)))
    (for-each write-string strings)
    (get-output-string (current-output-port))))

С аргументом-разделителем

Используя сгиб

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (fold (lambda (s so-far) (string-append so-far delimiter s))
            (car strings)
            (cdr strings))))

Использование рекурсии

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (let loop ((strings (cdr strings)) (so-far (car strings)))
        (if (null? strings)
            so-far
            (loop (cdr strings)
                  (string-append so-far delimiter (car strings)))))))

Использование строкового порта

(define (string-join strings delimiter)
  (if (null? strings)
      ""
      (parameterize ((current-output-port (open-output-string)))
        (write-string (car strings))
        (for-each (lambda (s)
                    (write-string delimiter)
                    (write-string s))
                  (cdr strings))
        (get-output-string (current-output-port)))))