2012-02-19 5 views
3

(大文字と小文字を区別)として私がしようとしている(これは、私が完全により良いアプローチがあるかもしれないと想像ほど簡単なものでなければならないように思えるものの一つである)文字列

をCommon Lispではマクロの引数を扱います可変数の引数をシンボルとして受け入れるマクロ(CLISP用)を定義します(大文字小文字を区別する文字列に変換されます)。

(defmacro symbols-to-words (&body body) 
    `(join-words (mapcar #'symbol-name '(,@body)))) 

ない膨張を有する単一の記号として

(defmacro symbols-to-words (&body body) 
    `(join-words (mapcar #'symbol-name '(|,@body|)))) 

扱い、@体、一方、大文字の文字列にシンボルを変換します。

アイデア?おそらくもっと簡単な方法だと思っています。

答えて

6

シンボル名は、マクロ展開の前に発生するリーダステップで大文字になります。そのため、マクロには何も影響しません。 READTABLE-CASEをグローバルに設定できますが、それはすべてのコードに影響します。特に、すべての標準シンボルをソースに大文字で書き込む必要があります。標準ライブラリの名前に小文字のバージョンを提供し、読者を大文字小文字のままにするCLISPのための '-modern'オプションもありますが、それ自体は非標準です。私は自分でそれを使用したことがないので、実際にどのような警告が実際に適用されるのか分かりません。

リーダーを制御するもう1つの方法は、リーダーマクロによるものです。 Common Lispには既に、大文字小文字を区別する文字列の構文を実装するリーダマクロがあります。double quote。なぜそれだけではないのかを知らずに、より多くのアドバイスを提供するのは難しいです。

3

Ramarrenが正しく言うように、シンボルの大文字は読み取り時に決定されます。マクロ展開時ではありません。

Common Lispはケースを変更せずに記号を指定するための構文は次のとおりです。

|This is a symbol| - 複数のエスケープ文字として垂直バーを使用します。

とバックスラッシュもあります - シングルエスケープ文字は:

CL-USER > 'foo\bar 
|FOObAR| 

その他のオプションは以下のとおりです。読み込み、ジャム読み取りマクロを使用して異なるグローバルreadtable場合

  • を使用して

    • ケース
    • 独自のリーダーを使用する読み取りマクロを使用する場合

    |,@body|(本文がスプライスされている)のような構文は、Common Lispには存在しません。スプライスインはシンボル名ではなく、リストに対してのみ機能します。 |、垂直バーは、シンボルの文字要素を囲みます。 Common Lisp Hyperspecの説明はちょっと暗いです:Multiple Escape Characters

  • 関連する問題