2012-01-12 15 views
20

मैं ("USERID=XYZ" "USERPWD=123") से "USERID=XYZ&USERPWD=123" में कनवर्ट करना चाहता हूं। मैंनेसूची में तारों में शामिल होने का कैननिक तरीका क्या है?

(apply #'concatenate 'string '("USERID=XYZ" "USERPWD=123")) 

जो ""USERID=XYZUSERPWD=123" लौटाएगा।

लेकिन मुझे नहीं पता कि '' कैसे सम्मिलित करें? निम्न कार्य काम करता है लेकिन थोड़ा जटिल लगता है।

(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))))) 

उत्तर

37

FORMAT का उपयोग करें।

~{ और ~} निरूपित यात्रा, ~A केवल जब कुछ यह इस प्रकार सौंदर्य मुद्रण, और ~^ (उर्फ डॉक्स में टिल्ड स्वरित) को दर्शाता है मुद्रण को दर्शाता है,।

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

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

~^के बारे में नहीं पता था; अच्छा! –

+0

दुर्भाग्य से यह Emacs "elisp" में काम नहीं करता है। उनके पास एक अलग प्रारूप समारोह है। क्या Emacs में ऐसा करने के लिए कोई तुलनीय तरीका है? – killdash9

+0

@ रुस: शायद। एक कुरकुरा जादूगर नहीं होने के कारण, मैं मूल लिस्प में वापस गया ... '(शामिल होने के लिए स्ट्रिंग (चीज और आराम तार) (लेबल ((रिकर्सर (तार) (cond ((> (लंबाई तार) 1) (सूची (कार तार) बात संलग्न() (recurser (सीडीआर तार)))) (टी (विपक्ष (कार तार) नहीं के बराबर))))) (लागू 'concat (recurser तार)))) ' –

1

स्ट्रिंग की एक सूची है और एक ही चरित्र सीमांकक मानते हुए, निम्नलिखित कुशलता से लगातार मंगलाचरण के लिए कम सूचियों पर काम करना चाहिए:

(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

थोड़ा देर से पार्टी के लिए, लेकिन reduce ठीक काम करता है:

(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)) 
संबंधित मुद्दे

 संबंधित मुद्दे