2012-01-30 9 views
5

मैं स्ट्रिंग को सूचियों में बदलना चाहता हूं। उदाहरण के लिए, http => (एच टी टी पी)।सामान्य lisp में # के बिना सूची में स्ट्रिंग

मैं कोशिश:

(defun string-to-list (s) 
    (assert (stringp s) (s) "~s :questa non e una stringa") 
    (coerce s 'list)) 

लेकिन अगर मैं ऐसा

(string-to-list "http") 

परिणाम:

(#\h #\t #\t #\p). 

मैं # \ हटा सकते हैं? अग्रिम धन्यवाद :)

उत्तर

16

आप ऐसा क्यों करेंगे? आप जो पूछते हैं वह एक स्ट्रिंग (वर्णों की एक-आयामी सरणी) को प्रतीकों की सूची में विभाजित करना है। क्या आप वास्तव में चाहते हैं कि?

#\h एक वर्ण वस्तु मुद्रित है।

आप उन्हें अलग ढंग से मुद्रित कर सकते हैं:

CL-USER 8 > (prinC#\h) 
h 

CL-USER 9 > (prin1 #\h) 
#\h 

के PRINC का उपयोग कर सूची प्रिंट करते हैं:। Btw

CL-USER 10 > (map nil #'princ (coerce "Hello!" 'list)) 
Hello! 

, के बाद से तार, वैक्टर और सूचियों दृश्यों हैं, तो आप स्ट्रिंग के ऊपर सीधे मैप कर सकते हैं ...

CL-USER 11 > (map nil #'princ "Hello!") 
Hello! 
3

आप एक स्ट्रिंग को intern के साथ एक प्रतीक में बदल सकते हैं। आप string के साथ एक स्ट्रिंग को एक स्ट्रिंग में बदल सकते हैं। लोअर-केस स्ट्रिंग को आंतरिक करने से इसे h के बजाय |h| के रूप में मुद्रित किया जा सकता है, इसलिए आप इसे string-upcase करना चाहेंगे। यह सब एक साथ रखकर देता है:

(loop for c in (coerce "http" 'list) 
     collecting (intern (string-upcase (string c)))) 
+0

धन्यवाद! तो (एच टी टी पी) के बजाय परिणाम (एच टी टी पी) का कोई रास्ता नहीं है? – r1si

+0

@ r1si: मैं इसे एक अतिरिक्त उत्तर में करने का एक तरीका दिखा रहा हूं। मैंने टिप्पणी का उपयोग किया होगा, लेकिन वे बहु-लाइन कोड उदाहरणों के लिए खराब हैं। –

3

लार्सन के उत्तर पर विस्तार, आप लो प्रिंट कर सकते हैं गैर उद्धृत wercase प्रतीकों अगर आप readtable बदलने के लिए:

(let ((*readtable* (copy-readtable))) 
    (setf (readtable-case *readtable*) :preserve) 
    (prin1 (loop for c in (coerce "http" 'list) 
       collecting (intern (string c))))) 

यह (h t t p) प्रिंट और (|h| |t| |t| |p|) वापस आ जाएगी।

3

आप अक्षरों को अनदेखा कर सकते हैं। परिवर्तनीय *PRINT-ESCAPE* देखें। WRITE फोन करके

(defun string-to-list (s) 
    (assert (stringp s) (s) "~s :questa non e una stringa") 
    (write (coerce s 'list) :escape nil) 


CL-USER 11 > (string-to-list "abcd") 
(a b c d) 
(#\a #\b #\C#\d) 

ऊपर के उदाहरण में प्रथम रूप छपा है और दूसरा रूप आरईपीएल द्वारा मुद्रित वापसी मान है:

समारोह WRITE कोई keyword पैरामीटर है कि के लिए :ESCAPE है।

+1

बस 'प्रिंस' के साथ पूरी सूची प्रिंट करने से इसके तत्व अनचेक भी प्रिंट होंगे। –