This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2015-06-16
Channels
- # admin-announcements (72)
- # beginners (41)
- # boot (93)
- # cider (50)
- # clojure (173)
- # clojure-berlin (19)
- # clojure-dev (2)
- # clojure-greece (3)
- # clojure-israel (2)
- # clojure-italy (32)
- # clojure-japan (33)
- # clojure-nl (8)
- # clojure-russia (3)
- # clojure-seattle (1)
- # clojure-sg (1)
- # clojure-spain (16)
- # clojure-uk (4)
- # clojure-ukraine (1)
- # clojurescript (170)
- # code-reviews (20)
- # core-async (3)
- # datomic (5)
- # docs (28)
- # editors (17)
- # euroclojure (2)
- # events (7)
- # instaparse (18)
- # jobs (25)
- # ldnclj (11)
- # om (26)
- # overtone (3)
- # remote-jobs (3)
- # sneer (1)
(defn p [x] {:pre [(or (some? x) (throw (ex-info "NILL ERROR" {:causes #{:nill-error}})))] :post [(= % 2)]} (+ x 1))
みたいにex-infoとかでやったりとかしてるのかとか。コンディションマップで指定できる:pre/:postは、いわゆる契約プログラミングにおける事前条件/事後条件なので、原則的にはそれらの条件を満たさないような状況っていうのは開発時にすべて取り除かれるべきで、実行時には基本的に起こりません
https://github.com/Prismatic/schema の代わりみたいにつかうのは変な感じなんでしょうか?
ちなみに、スタイルガイドにも https://github.com/totakke/clojure-style-guide#pre-post-conditions こんな記述もありまして。。
:pre/:post ってやってること他言語でいうアサーションと同じですよね。僕はエラーハンドルとかしようとしないでアサーションエラー飛ばしてしまいますね。基本的に開発時にその関数の期待値を明確化するという意味合いの方が強い気がしていますし。
ちなみに、https://github.com/Prismatic/schema の代わりと書いたのは引数のバリデーション的に使ったらどうだろと思い書いた次第です。
契約プログラミングの事前条件/事後条件って、型チェックをより強力にしたような感じで、AssertionErrorも本来はコンパイル時に検出したいことを実行時にしか検出できないから実行時にエラーとして出している、ぐらいのものだと思ってます
Clojure では契約プログラミングそれそのものをサポートはしていないけど、 :pre/:post を使うことで契約プログラミングぽく表明出来るよーということですよね。
あ、でSchemaとの絡みの話でいうと、Schemaはバリデーション(信用できない入力に対するチェック)用のライブラリで、バリデーションの結果入力が期待した値でなかった場合でも適切に例外処理をすれば復帰することができますが、AssertionErrorの場合は起きてしまったらそれはバグなので復帰のしようがないって違いはあるかと
> Schemaとの絡みの話でいうと、Schemaはバリデーション(信用できない入力に対するチェック)用のライブラリで、バリデーションの結果入力が期待した値でなかった場合でも適切に例外処理をすれば復帰することができますが、AssertionErrorの場合は起きてしまったらそれはバグなので復帰のしようがないって違いはあるかと ですごくすっきりしました!
またネタ振りだけですが、nekoがバージョンアップですね。実用性上がってたらいいですね。http://clojure-android.info/blog/2015/06/16/neko-400alpha1-changes-and/?utm_source=dlvr.it&utm_medium=twitter