20 травня 2012

Scheme: implode

Якось спало мені на думку написати аналог функції implode з PHP. Спочатку я написав її ось так:

(define (implode glue list)
  (let loop ((current (car list))
             (rest (cdr list)))
            (if (null? rest)
                current
                (loop (string-append current glue (car rest))
                      (cdr rest)))))

Але зараз подумав, що набагато краще не вигадувати велосипед, а користатися функцією reduce чи reduce-right з SRFI 1:

(require 'srfi-1)
(define (implode glue list)
  (reduce (lambda (a b) (string-append b glue a))
          ""
          list))

Або ось так, різниці ніякої:

(require 'srfi-1)
(define (implode glue list)
  (reduce-right (lambda (a b) (string-append a glue b))
                ""
                list))

Використовується так:

(implode "_" '("Hello" "world")
=> "Hello_world"

А в Chicken ця функція вже є, тільки аргументи в іншому порядку:

(string-intersperse '("Hello" "world") "_")
=> "Hello_world"

0 коментарів | Коментувати