Peter Norvigは、50ページの「人工知能プログラミングのパラダイム」で、特異性と一貫性の間のトレードオフと、setqまたはsetfを使用して変数を値に更新することを選択した場合について言及しています。おすすめは何ですか?読みやすさをはるかに超えて重要な状況に遭遇したことがありますか?
6 に答える
setqの使用はより低レベルですが、setfのパフォーマンスは問題ではありません。また、setfを使用すると、カスタムデータ構造の一部を設定するなど、カスタムsetf動作を提供できます(またはライブラリライター)。私は言います:あなたがそうしない理由がない限り、どこでもsetfで行きなさい。
PracticalCommonLispの第3章「SETFマクロはCommonLispの主要な代入演算子です」も参照してください。PCLはオンラインで無料で入手できます:http://gigamonkeys.com/book/
FWIW、私はいつもを使用しますsetf
。コードの構造を少し変更する場合は、場所と演算子の代わりに「場所」を変更する必要があります(setq-> setf)。
また、パフォーマンスについて心配する必要はありません。setfはシンボルのsetqとまったく同じです。
CL-USER> (macroexpand '(setf foo 42))
(SETQ FOO 42)
setf
どこでも使用できますsetq
。実際に setf
は、はに基づいて構築されたマクロsetq
です。したがって、これは純粋に読みやすさとスタイルの問題である必要があります。
私が見たほとんどすべてのコードは、の使用を避けて使用しsetq
ていますsetf
。
setfは「フィールドの設定」であり、場所を変更し、ユーザー拡張機能を持つことができます。setqは、最初の引数を引用符で囲んで設定されます。
そのセクションのノーヴィグの最後のアドバイスに従うことをお勧めします:一貫性を保つ。もちろん、「読みやすさ」はプログラミングで選択を行う最も重要な理由です。シンボルの値セル全体を処理していることを読者(おそらく2か月以内に)に伝えることが重要な場合は、setq
;を使用します。それ以外の場合はを使用しますsetf
。しかし、あなたが一貫している場合に限ります。
setqの代わりにsetfをどこでも使用した場合、間違いはありません。
Common Lispを前進させるのはこのようなものであり、実装者がまだサポートする必要のある未使用のものがたくさんあります。