2012-01-30 10 views
5

Stringをリストに変換したいと思います。たとえば、http =>(h t t p)です。共通の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

あなたはそれをどうしますか?あなたが求めているのは、文字列(文字の1次元配列)をシンボルのリストに分割することです。本当にそれが欲しいですか?

#\hは、印刷される文字オブジェクトです。

あなたは異なっそれらを印刷することができます

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

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

はのはPRINCを使用してリストを印刷してみましょう:

ところで
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

ありがとうございます! (H T T P)の代わりに(h t t p)を得る方法がないのですか? – r1si

+0

@ r1si:もう一つの答えでこれを行う方法を示しています。私はこのコメントを使用したでしょうが、複数行のコード例では悪いです。 –

3

larsmansの答えを拡大すると、loあなたがreadtableを変更する場合は引用符で囲まれていないシンボルをwercase:

(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は、そのためのキーワードパラメータ: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) 

及び第2の形態はREPLで印刷戻り値です。

+1

リスト全体を 'princ'で表示するだけで、エスケープされていない要素も表示されます。 –

関連する問題