1

複雑な s-expression ツリーを読み取り、いくつかのノードを変更して、どこかに保存することになっています。

処理中の 'read 関数が入力を「変更」しているようです。たとえば、簡単な例では次のようになります。

CL-USER> (read-from-string "(seq_num 123)")
(SEQ_NUM 123)
13

ノード (および値) が大文字になっていることがわかります。

同様に、値の最も外側の左右にパイプを追加できるようです。次のように:

CL-USER> (read-from-string "(password 000006013H)")
(PASSWORD |000006013H|)
21

パイプを追加します!

「そうしないように読む」ように指示する方法はありますか? s式が実際に有効なLISPプログラムである場合、そのような変更は正当な理由で行われると思います。しかし、ここではそうではありません。そのファイルを XML ファイルとして見てみましょう。s-expr のように見える単純な構成ファイル。読み取ったシンボルを「インターン」する必要はありません。私にとっては、ツリーを検索する最も簡単な方法であるため、ツリーとしてシリアル化を解除する必要があります( 'car および 'cdr は適切ではありません)。

ツリーが形成された場合、すべてのシンボルをインターンする必要があります..別の言葉で言えば、シンボルをインターンせず、代わりに文字列として保持するように彼に伝えるにはどうすればよいでしょうか。(したがって、コンスツリーを形成できますが、シンボルを指す代わりに、文字列を指すことになります。私の言いたいことがわかりますか?)

4

1 に答える 1

4

リーダーはデフォルトでシンボルを内部化します。リーダーとプリンターの両方が、シンボルの使用方法と表示方法に影響することに注意してください。シンボル呼び出しの実際のケースを見たい場合(symbol-name some-symbol)。プリンターは、必要に応じてシンボルをエスケープしようとします。これにより、シンボルが読み戻され、同じケースが使用されます。

CL-USER 26 > 'foo
FOO

CL-USER 27 > 'f\oo
|FoO|

CL-USER 28 > (symbol-name 'f\oo)
"FoO"

リーダーでは、シンボルの読み取り方法を制御できます。下記参照。

知っておくべきいくつかのこと:

  • すべての記号はデフォルトで内部的に大文字です。デフォルトでは、リーダーは小文字を大文字にします。

  • シンボルには、小文字を含む任意の文字を含めることができます。次に、シンボルはエスケープを使用する必要があります。

例:

|This is a valid symbol.|

縦棒はシンボル名の一部ではありません。それらはシンボルをエスケープするために使用されます。もう 1 つのエスケープ文字はバックスラッシュです。

1\a2

上も記号です。

  • 読み取りベースに応じて、数字または文字を含むものは記号または数字にもなることに注意してください。

例:

00a

上はリーダーベース 10 の記号です。

同じ例、他の読み取りベース:

00a

上記はリーダーベース 16 の数字です。

  • 非インターン シンボル (パッケージに含まれていない) は、次のように記述されます。

例:

#:non-interned-symbol
  • キーワード記号:

例:

:keyword-symbol

読み取り中にシンボルが作成/ルックアップされる場合に、どのように影響を与えることができますか?

  • シンボルをエスケープできます。上記を参照してください

  • 大文字と小文字が異なる readtable を使用します。

Common Lisp Hyperspec の例: 23.1.2.1 Lisp リーダーに対する Readtable ケースの影響の例

プリンターでのエスケープを無効にする

CL-USER 36 > (let ((*print-escape* nil))
               (write (read-from-string "(|passWord| 000006013H)")))
(passWord 000006013H)
...
于 2013-05-13T15:34:59.273 に答える