2012-01-13 2 views
1

私はいくつかのテキスト処理をしていますが、その一部は単語を1文字に分割しています。すべてのキャラクターは大文字の記号として拘束され、簡単にするためにそれに割り当てられたいくつかの頻度値が割り当てられていますが、想像できるように、T定数の形で不安定なブロックがあります。シンボルがTかどうかをチェックするには?

私は今で探しています解決策は、単に手元のシンボルがT.

であるかどうかを確認するために迅速かつ簡単な方法が存在することになる場合は、私は疑問に思って、小文字のシンボルの代わりに、大文字Tを使用することです

私は考えることができるすべては、次のとおりです。

(インターン((文字列=「T」(シンボル名のシンボル))#の\ tの記号)

が、文字列の比較ではないので、それは単に見栄えしない場合面倒なことがありますか?

PS。すべての記号が必要ですそれはリスナーで評価するのが面倒ではありませんが、私は小文字のtで生きることができます。

+0

なぜあなたは 'T'を避けようとしていますか? –

+0

私はそれを避けようとはしていませんが、実際にはそれを使用したいのですが、現在のLisp開発の状態ではできません。 – Werdok

答えて

0

あなたはシンボルTshadowことがあります。影の定数Tはまだcl:tと呼ぶことができる

CL-USER> (shadow 't) 
COMMON-LISP:T 
CL-USER> (let ((t 17)) t) 
17 

を。

+0

うん、それは間違いなくトリックですが、私はおそらく空のパッケージでこれをやっていて、それは理想的になるでしょう。 – Werdok

5

現在のパッケージをアドホックにハッキングする代わりに、hashtableを使用する必要があります。それはTの問題を完全に回避し、はるかにクリーンな解決策です。

concisionが問題になる場合は、(defun frequency (char) (gethash char the-table))のような機能を持つことができます。これはコードの本体でも使用する必要があります。短くすると、コードは "文字数" 「ハッシュテーブルの値を参照する」という意味ではなく、あなたはREPLのためのミニマリズムをキーボード入力での究極を探しているなら

、あなたのような読者のマクロを定義すると、これまで行くことができます:

私はあなたが完全に理解していない可能性があります推測
(set-macro-character #\? 
        (lambda (stream char) 
         (declare (ignore char)) 
         (let ((char (read stream))) 
         `(frequency (character ',char)))) 
        t) 

が、それにもかかわらず、あなたは#\ Aの頻度を?Aのような簡単なもので調べることができます。

とにかく、目的は簡単で目立つように、またスタイルや「ベストプラクティス」に合わせてコードを書くことです.REPLのタイプが少ないような特別な目的があれば常に別の抽象化レイヤーを重ねることができます。

+0

私は一種のことを知っていますが、REPLの目的のために、それはさらに厄介です。毎回書く(シンボルテーブルをgethash)。質問するときのシンプルさは、私がここにいるものです。 – Werdok

+0

@Werdok:これがREPLで使用する場合は、テーブルを取り、単純な関数(fシンボル)を(gethashシンボルテーブル)に定義する関数を作るだけではどうですか? fが適切なスコープ内で束縛されることができるならば、schemey-lispy構文 '(make-easy table)(define(f symbol)(gethash symbol table))))')の組み合わせ。 – ccoakley

+0

私は、テーブルのコンテキストを入れ替える必要がない場合(たとえば、多くのファイルを分析する場合など)、私が書いたことをたくさん必要としないことを認識しました。そして、あなたは現在、テーブルなしでシンボルを使用しているだけなので、おそらくコンテキストを切り替えるわけではありません。 – ccoakley

関連する問題