2012-03-15 7 views
19

ループを使用するよりもあまり冗長な方法がないのだろうかと思います。私はmaphashを使用して他の人を見てきましたCommon Lisp:指定されたハッシュテーブルのすべてのキーをリストとして取得する

(loop for key being the hash-keys of *my-hash* collect key) 

、それはリストに、各キーを蓄積含ま:とにかく、これはCLISPに私のために動作します。ループを使用するよりも複雑であることを除けば、私はできる限り避けることを試みる副作用を導入する - 可能な限り関数型プログラミングを好む。

この共通の定義済みのものはありますかタスク、たとえ実装固有ですか? Common Lispの哲学「電池は、付属の」前から来て

(defun hash-keys (hash-table) 
    (loop for key being the hash-keys of hash-table collect key)) 

答えて

20

が流行となり、ほとんどの機能は、サードパーティのライブラリやないの実装によって提供されることが期待されます。 Common Lispは大規模言語と呼ばれることもありますが、Cなどとの比較にすぎません。Pythonやその他の大規模な標準ライブラリを持つ言語と比べると、言語そのものは非常に小さいです。

AlexandriaはCommon Lispユーティリティの一般的なコレクションです。他にも多くのものの中にはhash-table-keysが含まれています。

+2

Common Lispは非常に多くの時間を「電池が含まれていました」。人々はちょうど今より多くの(そして異なる種類の)電池を期待しています。 – Xach

+1

Common Lispは現在Cと比べるとわずかに大きいだけです。これは現在、700ページのISO標準に近づいています。 (これは、1989年の200年代のページよりもわずかに「電池が含まれた」言語にすぎません) – Kaz

+0

最近では、ほとんどの「電池が含まれています」という言葉は**そのようになっています。あなた自身が書くことは、パフォーマンスの欠点があります。 – Kaz

9

のCommon Lispでの関数がコンパイルされるので

(defun hash-keys (hash-table) 
    (loop for key being the hash-keys of hash-table collect key)) 

を定義するには不利な点はありません。あなたのベンダーがこの機能を提供していれば、それはあなたのものよりもはるかに効率的で、同じことをするでしょう。

翻訳された言語では、自分自身を書くほとんどのものは、「本質的な」ルーチンに比べてパフォーマンス上の欠点があります。

ハッシュの内容を無駄にすることは無駄です。ループを使用すると、メモリを節約することなくハッシュを処理できます。だから多分代わりにマクロが必要です(一部のリスプはdohashまたはそれに類するものを拡張子として提供しています)。

(defmacro do-hash ((key-var val-var hash-expr &optional result-form) &body body) 
    (let ((hash-var (gensym "HASH-"))) 
    `(loop with ,hash-var = ,hash-expr 
      for ,key-var being the hash-keys of ,hash-var 
      for ,val-var being the hash-values of ,hash-var 
      do (progn ,@body) 
      finally (return ,result-form)))) 

やハッシュマッピング機能:

(defun mapc-hash (hash-table fun) 
    (loop for key being the hash-keys of hash-table 
     for value being the hash-values of hash-table 
     do (funcall fun key value))) 

言語は、誰でも分で書くことができ、このようなすべての可能なガジェットを持っているべきですか?

Common Lispには、バッテリが含まれていますが、実際には実行しにくい他の種類のバッテリです。たとえば、compileは、実行時に動的にコードをコンパイルする機能です。ほとんどのユーザーにとって、ハッシュテーブルからキーや値を6つの異なる方法で引き出すのと比較して、最初からこのようなことを開発することは非常に困難です。

+0

(ここに紹介するマクロ定義機能はもちろんのこと、... :))。 –

関連する問題