2016-01-05 24 views
6

私は現在、いくつかのClojureコードを読んでいます。このコードでは、渡されたレコードの数値のために、未初期化値の束がnilとなっています。Clojureにnil-punningの慣用的な代替手段はありますか?

多くのClojureライブラリtreat this as idiomaticがあります。つまり、それは受け入れられた大会です。

しかし、すべてのClojureコア関数がnilを入力として扱うわけではないので、NullPointerExceptionにもつながります。 (彼らもそうはならない)。

リスクを緩和する方法として、他の言語では、NULLである場合に値をプロキシするためにMaybeまたはOptionという概念があります。これはClojure-but not very commonで可能です。

fnilでいくつかのトリックを行うことはできますが、すべての問題を解決するわけではありません。

もう1つの方法は、初期化されていない値を:empty-valueのような記号に設定して、ユーザーがすべての処理コードでこのシナリオを明示的に処理するようにすることです。しかしこれは実際にはnilからの大きなステップアップではありません - 実行時まですべてのシナリオ(他の人のコード内)を実際に発見しないからです。

私の質問は:Clojureにはnil-punningの慣用句がありますか?

答えて

5

ないあなたはnil-punningにこのlispcast postを読んだかどうかわから、私はそれはそれは慣用的だと私はそれらの他のSOの質問で述べた見なかった様々な重要な考慮事項をカバーする理由のためにかなり良いケースを作ると思います。

基本的には、nilは、クロージャーでのものがです。その固有の従来の意味にもかかわらず、であり、多くのコンテキストでコンテキスト依存の方法で処理できます。これにより、ホスト言語でnullより柔軟で強力なものになります。例えば

、このようなものであってもJavaでコンパイルされません。

のClojureのように、(if nil ...)がうまく動作します
if(null) { 
.... 
} 

。だから、あなたが安全にのを使用できる多くの状況があります。私はまだではないのコードをif(foo != null) { ...のように散らばっていないJavaコードベースを見ています。おそらくjava 8のOptionalがこれを変更します。

は、実際にnullを扱っているJava相互運用シナリオで問題が発生しやすいと思います。良いclojureラッパーライブラリーは、多くの場合にこれからあなたを守るのに役立ちます。への1つの正当な理由は、可能であればを直接Java相互接続に優先します。

これを考慮して、この電流との戦いを再検討することをお勧めします。しかし、あなたが代替案を尋ねているので、ここでは偉大だと思うのはprismatic's schemaです。スキーマにはMaybeスキーマ(および他の多くの有用なスキーマもあります)があり、多くのシナリオではうまく機能します。ライブラリはかなり人気があり、私はそれを成功に使用しました。FWIWでは、最近のclojure appliedの本でお勧めします。

1

Clojureにnil-punningの慣用句がありますか?

番号は、leeorが説明しているように、nil-punningは慣用的です。しかしCommon Lispのように普及しているわけではありません。空リストは無名になります。

Clojureはこのように動作しましたが、リストを扱うCL関数は一般にシーケンスを扱うClojure関数に対応しています。これらのシーケンスは怠け者かもしれないので、他の人とレイジーシーケンスを統一することにはプレミアムがあるので、どんな怠惰も保存できます。私はこの進化がClojure 1.2について起こったと思います。リッチはそれを詳細にhereで説明しました。

オプション/多分タイプが必要な場合は、core.typedライブラリをご覧ください。プリズムスキーマとは対照的に、これはコンパイル時に動作します。

関連する問題