11

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

私が知りたいのは、実際に common-lisp をどのように使用すれば、私が書いた elisp が大半の elisp コーダーに受け入れられる可能性が高くなるかということです。具体的には、Common Lisp を完全に使用しないようにする必要がありますか、それとも言語の一部にすべての人に受け入れられる部分があり、大部分のコーダーが冷笑したり嘲笑したりする部分がありますか?

答えの幅を制限したくないのであれば、これは次のとおりです。

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

これよりもはるかに受け入れられます:

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

3 に答える 3

8

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

しかし、非常に長い期間のサポートを計画していて、何らかのバックアップが必要な場合は、次のようにします (しかし、私自身はそうしていません。戦術)。使用している CL パッケージの関数については、defaliasすべての関数にcl-プレフィックスを付ける特別なファイルを作成します。したがって、たとえば、 a の代わりに があり(position ...)ます(cl-position ...)。理論的には、前方互換性の問題を回避できます。ただし、関数はすぐには削除されません。非推奨になる前に警告が表示され、更新に多くの時間がかかります。あなた次第です。

Common Lisp のループ マクロは、それ自体が論争の的になっています。これは言語の典型的な構造ではありません。そのため、たとえば iterate ライブラリが存在します。また、それをうまく使用するには、「ループ ミニ言語」を学習する必要があります。これは、一種の小さなドメイン固有言語であり、この種の構造体で使用する必要は実際にはありません。しかし、ループには強い側面があります。mapcarorなどのリスト処理関数reduceは、あなたの例のように、より些細なケースでうまく機能しますが、それほど重要ではないケースloopでは、同じことを行うためのより優れた、より冗長な方法になります。

于 2012-10-29T08:07:38.433 に答える
4

マニュアルのマクロセクションを読みましたか? あなたの例のようなマクロを使用してloopもまったく問題ありません。

ただしeval-when-compile、require の前後で使用します。

実際(eval-when-compile (require 'cl))、Emacs のルート Lisp フォルダーだけで 66 回表示されます。

于 2012-10-29T11:11:30.793 に答える
4

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

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

注: nicferrier のブログで、elisp プログラミングに関するアドバイスを見つけることができます。

于 2012-10-29T12:24:11.357 に答える