シンボルプロパティを使用する場合


7

シンボルをディレクトリに関連付ける必要があるとします。これは、少数のboundpシンボルに対してのみ行う必要があります。

私の見方では、2つの簡単な方法があります。

  1. この関連付けを別の変数(alistまたはハッシュマップ)に格納します。これにより、各シンボルのディレクトリにでアクセスできるようになります(cdr (assq SYMBOL my-alist))
  2. これをシンボルプロパティに格納します。これにより、でアクセスできるようになります(get SYMBOL 'my-directory)

これらのうち、この情報を追跡する慣用的な方法はどれですか?


値を一時的なスコープに動的にバインドしたい人のためのユースケースがないことを確実に知っているかどうかを示す価値があります(オプション2はほとんど除外されるため)。
phils 2015年

@phils良い点。設計上、拘束されることを意図したものではありませんが、それは妥当な懸念事項だと思います。他の人があなたの関数にどんなユースケースを見つけるかは決してわかりません。
マラバルバ2015年

@phils:どういう意味ですか?ここで問題となっているのは、シンボルの値ではなく、シンボルの小道具だけです。(defvar s 5) (put 's 'd "c:/abc/") (let ((s 4)) (message "d: %s, val: %S" (get 's 'd) s))。そしてOP:なぜあなたはシンボルではなく「機能」について話すのですか?私は何かを逃しているに違いない。
2015年

@Drew彼は、シンボルに関連付けられたディレクトリをバインドすることを意味しました。シンボルプロパティを使用する場合は不可能ですが、この情報を連想リストなどの変数に格納することは可能です(連想リストをバインドするだけです)。2番目の質問については、もちろんすべての動作が関数によってラップされるため、「関数」と言いました。機能のないパッケージを見たことがありません。:-)
マラバルバ2015年

2人がお互いを理解していれば説明する必要はありませんが、FWIWはまだ理解していません。「dirをバインドする」とは、変数をdir文字列にバインドすることを意味すると想定します。シンボルプロパティの値がシンボルである可能性は確かにあり、そのシンボル値はdir文字列を保持します。let-dir-stringシンボル(prop値として使用される)は問題になりません。(適切でない場合は自由に無視してください。)
2015年

回答:


7

それは本当にユースケースに依存します。

一般的に言って、シンボルプロパティは「低レベル」/「内部」機能であり、「ユーザーレベル」のものには使用しないでください。しかし、すべてのための場所があります:-)

考慮すべきいくつかのポイントは次のとおりです。

  1. 速度:シンボルプロパティが最も速く、ハッシュテーブルがそれに続きます。連想リストは遅いです。
  2. alist / hash table(変数をにリセット)を使用してシステムをリセット(つまり、パッケージのすべての痕跡を削除nil)する方が、シンボルプロパティ(を繰り返しobarray、すべてのシンボルからすべての関連プロパティを削除する)よりも簡単です。
  3. alistを使用して設定を動的にシャドウするのは簡単です。ハッシュテーブルとシンボルプロパティでははるかに困難です。

あなたが考慮したいと思うかもしれないもう一つのオプションは.dir-locals.elです。


いい答えです。しかし、#2についてのDunno。「システムをリセットする」とはどういう意味ですか?シンボルからプロパティを削除する(たとえば、リストからキーを削除する)ことの難しさについて話していますか?
2015年

@Drew:私は私のポイントを明確にしました。もういいですか?
sds 2015年

はい、今は完全に晴れています。もしかしてあなたがそれを意味していないのではないかと思いました。
2015年

0

ディレクトリの正規名を使用している限り、ハッシュテーブルまたはリストのいずれかが機能します。ユーザーがデータを変更または検査することを期待する場合は、リストを使用してください。それ以外の場合は、ハッシュテーブルが最適に機能し、より適切にスケーリングされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.