5

私はCommonLispを学び始めたばかりで、急速にそれに夢中になり、型システムに移行しました。私は、応用プログラミングに対する特別な愛情を育んでいるようです。

私が理解しているように、CLでは文字列とリストは両方ともシーケンスですが、シーケンスをマッピングするための標準関数はなく、リストのみであるようです。それらがリストに提供される理由、それらが基本的なデータ型である理由などはわかりますが、シーケンスで機能するように設計されていないのはなぜですか?それらはより一般的なタイプであるため、リストよりもアプリケーション関数をターゲットにする方が便利なように思われます。それとも私はそれがどのように機能するかを完全に誤解していますか?

編集:

私が特に混乱しているのは、シーケンス(抽象化)とリスト(実装)がCLで混乱しているように見える方法でした。これは歴史的な理由によるものであるというのがコンセンサスのようです。lispは非常に長い間存在しているため、その機能とマクロを介してソフトウェアエンジニアリングプラクティスの開発をほぼ計画することができます。CLには、リストでのみ動作するシーケンス前の抽象化関数と、シーケンスでより一般的な方法で同じことを行う関数が混在しているため、どの関数がシーケンスに適用され、どの関数がリストに適用されるかは一見任意に見えます。現時点でCLを学んでいる人として、著者が最初にシーケンスをよりクリーンな抽象化として導入し、次にその抽象化の最も基本的な実装としてリストを購入すると便利だと思います。

4

2 に答える 2

12

なぜ、シーケンスで動作する関数がたくさんあります。シーケンスのマッピングは、MAPまたはMAP-INTOを使用して行われます。

詳細については、CLHSのシーケンスセクションを参照してください。

うまく整理されたクイックリファレンスもあります。

于 2009-04-02T13:25:57.970 に答える
1

まあ、あなたは一般的に正しいです。mapcarほとんどの関数は、実際にリスト ( 、findcount、など)removeに焦点を当てていますappend。これらのいくつかについては、シーケンス ( concatenatesomeおよびevery頭に浮かぶ) に対して同等の関数があり、リストの同等物が古くなっているものもあります (例:nthリストのみ)。対eltすべてのシーケンス)。一部の関数は、シーケンスに対してのみ機能します (lengthたとえば、 )。

CLは少し混乱しています。hugeのように、これは大きな言語です。私の知る限り、700以上の機能があります。そしてそれは古いです。これらの関数の一部は慣例により非推奨であり、他の関数はほとんど使用されていません。

はい、すべてのシーケンスに意図したとおりに適用されるマッピング関数をメソッドにする方が便利です。CL は単純にそのように構築されていませんでした。もし今日再び建設されたとしたら、これは考慮され、非常に異なったものになると確信しています.

とはいえ、あなたは完全に寒さに取り残されているわけではありません。このloopマクロは、シーケンスに対しても機能しますiterate(別のループ マクロで、たまたま気に入っています)。これで遠くまで行けます。ほとんどの実用的な目的でリストを使用しますが、これは実用的な問題以上のものではありません。ベクトル (または一般的なシーケンス) のマッピング関数が不足している場合、誰がそれを書くのを止めますか?

于 2009-04-02T13:18:53.027 に答える