2012-01-12 22 views
20

("USERID=XYZ" "USERPWD=123") ürününü "USERID=XYZ&USERPWD=123" ürününe dönüştürmek istiyorum. ""USERID=XYZUSERPWD=123" döndürecek olanListedeki dizeleri birleştirmenin standart yolu nedir?

'u denedim.

Ama '&' nasıl ekleneceğini bilmiyorum? Aşağıdaki işlev çalışır, ancak biraz karmaşık görünüyor.

(defun join (list &optional (delim "&")) 
    (with-output-to-string (s) 
     (when list 
      (format s "~A" (first list)) 
      (dolist (element (rest list)) 
       (format s "~A~A" delim element))))) 

cevap

37

kullanın FORMAT.

~{ ve ~} anlamında olabildikleri yineleme, ~A şey onu takip yalnızca, baskı gösterir estetik yazdırma ve ~^ (docs aka Tilde inceltme) belirtir.

* (format nil "~{~A~^, ~}" '(1 2 3 4)) 

"1, 2, 3, 4" 
* 
+0

~ ^; Güzel! –

+0

Bu maalesef Emacs "elisp" de çalışmıyor. Farklı bir format işlevi var. Bunu Emacs'te yapmak için benzer bir yolu var mı? – killdash9

+0

@russ: Muhtemelen. Bir elisp sihirbazı olmama, temel Lisp'e geri döndüm ... '(defun birleştir-str (şey ve dinlenme dizeleri) (etiketler ((recurser (dizeler) (koşul ((> (uzunluk dizeleri) 1) )))) ('concat (recurser dizeleri uygulamak))))() nil t (aleyhte (araba dizeleri)) ())) ( (recurser (cdr dizeleri listesi (araba dizeleri) şey ekleme) –

1

dizeleri listesini ve tek bir karakter sınırlayıcı varsayarsak, şu kısa listelerinde sık çağrı için verimli çalışması gerekir:

(defun join (list &optional (delimiter #\&)) 
    (with-output-to-string (stream) 
    (join-to-stream stream list delimiter))) 

(defun join-to-stream (stream list &optional (delimiter #\&)) 
    (destructuring-bind (&optional first &rest rest) list 
    (when first 
     (write-string first stream) 
     (when rest 
     (write-char delimiter stream) 
     (join-to-stream stream rest delimiter))))) 
0

Biraz geç partiye, ama güzel reduce çalışır:

(reduce (lambda (acc x) 
      (if (zerop (length acc)) 
       x 
       (concatenate 'string acc "&" x))) 
     (list "name=slappy" "friends=none" "eats=dogpoo") 
     :initial-value "") 
0
(defun %d (stream &rest args) 
    (declare (ignore args) 
      (special delim)) 
    (princ delim stream)) 

(defun join (list delim) 
    (declare (special delim)) 
    (format nil "~{~a~^~/%d/~:*~}" list)) 
İlgili konular