2011-11-16 5 views
1

私は((p X) (q (f X)))のようなリスト構造を保持する文字列を持っていて、それは'((p X) (q (f X)))のようにこの文字列をリストのリストとして解釈/変換する関数を実際に探したいと思っています。文字列をリスト構造として解析する方法は?

(list "((p X) (q (f X)))")は、単一の要素リストにするだけです。

(intern "((p X) (q (f X)))")シンボル。

答えて

7

あなたのため

(read-from-string "((p X) (q (f X)))") 

しくみを教えてください。ドキュメントはhereです。

+0

神よ!それがまさに私が必要なものです。私はあまりに早くgoogleをあきらめた。ありがとう、兄さん! – user1048677

2

"((p X) (q (f X)))"はLispの文字列です。文字列は"で囲まれています。

LISTは、その引数を要素としてリストを作成します。

したがって(list "((p X) (q (f X)))")は、文字列を要素としてリストを作成します。

INTERNはシンボルを作成します。

(intern "((p X) (q (f X)))")は、名前として文字列引数を含むシンボルを作成します。 Common Lispのシンボルには、()のような文字を含めても、任意の名前を付けることができます。このようなシンボルは、|で囲まれて印刷されています。例:|((p X) (q (f X)))|は、このような奇妙な名前のシンボルです。

S式の解析は、となり、Lispではとなります。そのための機能は、例えばREADREAD-FROM-STRINGです。

ありS式を読み込むための2つの基本的な方法です:

CL-USER 1 > (read-from-string "((p X) (q (f X)))") 
((P X) (Q (F X))) 
17 

は、しかし、あなたはまた、WITH-INPUT-FROM-STRINGを使用して文字列に基づいて、入力ストリームを開き、通常のREADを使用することができます。

CL-USER 2 > (with-input-from-string (stream "((p X) (q (f X)))") 
       (read stream)) 
((P X) (Q (F X))) 
関連する問題