2012-10-29 7 views
11

誰かがelispでclパッケージを使用して特定の問題が何であるか説明してもらえますか? emacsの新しいコーダーとして、私は(require 'cl)オプションに到達するたびに間違いをしているように感じます。私は、clパッケージのバイトコンパイルの問題を読んで理解しています。私は古い議論を見て、それを復活させたくはありません。私はcommon-lispがx brand lispよりも優れているかどうかについての一般論者のコメントも探していません。elispでcommon-lispを使用するにはどうすればよいですか?

私が知りたいのは、実質的にどのようにcommon-lispを使うのかです。私が書くelispは大部分のelispコーダーによって受け入れられる可能性が高いからです。具体的には、共通のlispを完全に使用することを避けるべきですか、誰もが受け入れる言語の部分と、多くのコーダーがうんざりして嘲笑する部分がありますか?

答えの幅を限定することを望まないが、これは次のようになりますはるかに許容これより

(mapcar (lambda(x) (* x x)) '(1 2 3)) 

(require 'cl) 
(loop for el in '(1 2 3) collect (* el el)) 
+1

common-lispが好きでない人(あるいは多少の人がいなくて、神話が破棄されているかもしれない人)から何かコメントを得るのはすばらしいことです。 –

+3

CLパッケージはCommon-Lispではないので、一方は好きで他方は嫌いです。私はCLパッケージが提供するものの多くを好んでいますが、さまざまな理由で問題の多い部分があります。 Emacs-24.3の新しい 'cl-lib'ライブラリは、' cl-lib'が良いかどうか気にする必要がないように名前空間を整理します。私が気に入らないCLの部分は、 "単純なインタプリタ"の実装には適さないCommon-Lispの機能と関係しているので、予期しないパフォーマンスコストを招く可能性があります。 (さらに、実装に欠陥があるいくつかの機能) – Stefan

答えて

8

サードパーティのライブラリの多くを使用してのいくつかを書いている間私自身のeLispコードでは、CLパッケージを使用したときに名前の競合が発生したことはありませんでした。だから、私はCLを使うことに反対する議論は、純粋主義(物の宗教的側面を意味するものではなく、言葉の本来の意味で)であると言いたいと思うでしょう。

しかし、あなたが非常に長い時間のサポートを計画していて、何らかのバックアップをしたいのであれば、ここで私は何をしますか(私はそれをやっていません。より良い戦術になるために)。使用しているCLパッケージの関数については、defaliasのすべてにcl-の接頭辞を持つ特別なファイルを作成してください。たとえば、(position ...)の代わりに、(cl-position ...)があります。理論的には、前方互換性の問題を解決します。しかし、機能が即座に削除されることはありません。その機能が廃止される前に警告が表示され、更新に多くの時間がかかります。あなたまで、本当に。

Common Lispのループマクロはすべて論争であり、言語の典型的な構成ではないため、たとえば反復ライブラリが存在する理由があります。また、小さなドメイン特有の言語の一種である「ループミニ言語」をうまく使うことを学ぶ必要があります。この種の構造では、実際に使用する必要はありません。しかし、ループは強い側面を持っています。 mapcarreduceのようなリスト処理関数は、あなたの例にあるような、より単純なケースではうまく機能しますが、それほど簡単なケースでは、同じことをするのがより良い方法ではありません。

4

マニュアルのsectionマクロを読んだことがありますか?たとえば、loopのようなマクロを使用しても問題ありません。

ただし、必要に応じてeval-when-compileを使用します。

実際、(eval-when-compile (require 'cl))はEmacsのルートlispフォルダの66倍です。

+0

はい私はマクロセクションを読み、パッケージ内のマクロコードを調べました。マクロソリューションが必要な問題を見つけたとき、私はまだそれを待っています。 –

+0

マクロソリューションは問題ありません。かなりの数はマクロで簡素化することができます。これはelispではなくclojureの例ですが、私は自分の名前空間内にjavaクラスのすべての静的フィールドを公開して公開しています。マクロを使用しない 'ソリューション'は、バインディングを1つずつ書き込むことです。 – Cubic

4

あなたのコードをEmacsに統合する予定がない限り、CLパッケージを使用して、このスニペットを.emacsに入れて警告を無効にしてください。

(byte-compile-disable-warning 'cl-functions) 

注:nicferrier's blogにelispのプログラミング上のいくつかのアドバイスを見つけることができます。

関連する問題