Например, у меня есть (list "a" "1" "b" "2" "c" "3")
.
Теперь я хочу превратить этот список в один "a1b2c3"
.
Как я могу это сделать?
Спасибо.
Например, у меня есть (list "a" "1" "b" "2" "c" "3")
.
Теперь я хочу превратить этот список в один "a1b2c3"
.
Как я могу это сделать?
Спасибо.
(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))
apply
создают список аргументов из своих входных данных, поэтому они могут достичь предела длины списка аргументов языковой реализации, если им предоставляется длинный список. Предел не очень высок в некоторых языковых стандартах/реализациях; не уверен, как обстоят дела с Scheme/Racket.
- person Lassi; 18.04.2019
apply
даже для длинных списков.
- person Óscar López; 18.04.2019
Не изобретайте велосипед! в 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
: они задают альтернативный разделитель между двумя последними строками, строкой префикса и строкой суффикса соответственно.
Вот некоторые реализации с разделителем и без него (то есть строка, которая вставляется между каждой парой строк, например пробел или запятая).
Функции fold
и fold-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)))))