clojure-japan

2015-06-16T04:10:52.000374Z

ちょっと聞いてみたいことがありまして、ネタ投下します。

2015-06-16T04:11:25.000375Z

みなさん、コンディションマップって使ってますか?あと、使ってるとしたら、エラーハンドリングどうしてます?

2015-06-16T04:11:55.000376Z

(defn p [x] {:pre [(or (some? x) (throw (ex-info "NILL ERROR" {:causes #{:nill-error}})))] :post [(= % 2)]} (+ x 1))
みたいにex-infoとかでやったりとかしてるのかとか。

athos 2015-06-16T05:15:13.000377Z

コンディションマップで指定できる:pre/:postは、いわゆる契約プログラミングにおける事前条件/事後条件なので、原則的にはそれらの条件を満たさないような状況っていうのは開発時にすべて取り除かれるべきで、実行時には基本的に起こりません

2015-06-16T05:17:17.000378Z

ふむふむ、なるほど

2015-06-16T05:18:01.000379Z

https://github.com/Prismatic/schema の代わりみたいにつかうのは変な感じなんでしょうか?

2015-06-16T05:26:15.000381Z

ちなみに、スタイルガイドにも https://github.com/totakke/clojure-style-guide#pre-post-conditions こんな記述もありまして。。

ayato_p 2015-06-16T05:43:51.000383Z

:pre/:post ってやってること他言語でいうアサーションと同じですよね。僕はエラーハンドルとかしようとしないでアサーションエラー飛ばしてしまいますね。基本的に開発時にその関数の期待値を明確化するという意味合いの方が強い気がしていますし。

ayato_p 2015-06-16T05:44:49.000384Z

schema の代わり、というのはちょっと分からなかったです。

ayato_p 2015-06-16T05:48:12.000385Z

(別に他言語っていわなくても Clojure でもアサーションですね)

2015-06-16T06:29:56.000387Z

なるほどなるほど、ありがとうございます。

2015-06-16T06:33:10.000388Z

ちなみに、https://github.com/Prismatic/schema の代わりと書いたのは引数のバリデーション的に使ったらどうだろと思い書いた次第です。

ayato_p 2015-06-16T06:34:35.000390Z

実際バリデーションのように使いますよね?その目的が若干違うだけだと僕は思いますよ。

ayato_p 2015-06-16T06:35:37.000391Z

(defn foo [m] {:pre [(map? m)]} (do-something))

ayato_p 2015-06-16T06:35:41.000392Z

みたいに。

athos 2015-06-16T07:18:29.000393Z

離脱してました

athos 2015-06-16T07:20:37.000394Z

:pre/:postの違反で出るエラーを捕捉して処理するみたいなことはやらないで、普通はAssertionErrorが出るに任せるんだと思います

athos 2015-06-16T07:25:03.000395Z

契約プログラミングの事前条件/事後条件って、型チェックをより強力にしたような感じで、AssertionErrorも本来はコンパイル時に検出したいことを実行時にしか検出できないから実行時にエラーとして出している、ぐらいのものだと思ってます

athos 2015-06-16T07:28:28.000396Z

あー、言語によっては事前条件/事後条件の違反もコンパイル時に検出できるという話は聞くので、一応そこは補足しておきます

ayato_p 2015-06-16T07:28:39.000397Z

https://ja.wikipedia.org/wiki/%E8%A1%A8%E6%98%8E

ayato_p 2015-06-16T07:28:56.000398Z

Eiffel とかがそうなんですかね?

athos 2015-06-16T07:29:27.000399Z

はいはい、あとDもって話を聞いた気がします

ayato_p 2015-06-16T07:29:33.000400Z

なる。

ayato_p 2015-06-16T07:32:52.000401Z

Clojure では契約プログラミングそれそのものをサポートはしていないけど、 :pre/:post を使うことで契約プログラミングぽく表明出来るよーということですよね。

athos 2015-06-16T07:34:36.000402Z

ですね。Clojureだとcore.contractsもありますけど、どこまでできるのかは把握できてないです

athos 2015-06-16T07:39:31.000403Z

あ、でSchemaとの絡みの話でいうと、Schemaはバリデーション(信用できない入力に対するチェック)用のライブラリで、バリデーションの結果入力が期待した値でなかった場合でも適切に例外処理をすれば復帰することができますが、AssertionErrorの場合は起きてしまったらそれはバグなので復帰のしようがないって違いはあるかと

ayato_p 2015-06-16T07:40:19.000404Z

おお、僕が言葉にできなかったモヤモヤが言語化されている

athos 2015-06-16T07:41:09.000405Z

Schemaを事前条件/事後条件に使うこともできなくはないかもしれないですが、それはSchema本来の使い方ではないと思います

2015-06-16T07:49:40.000406Z

> Schemaとの絡みの話でいうと、Schemaはバリデーション(信用できない入力に対するチェック)用のライブラリで、バリデーションの結果入力が期待した値でなかった場合でも適切に例外処理をすれば復帰することができますが、AssertionErrorの場合は起きてしまったらそれはバグなので復帰のしようがないって違いはあるかと ですごくすっきりしました!

2015-06-16T11:25:44.000407Z

schemaは型チェックの有効無効が切り替えられたんではなかったですかね。そのあたりも便利ではないかと。

2015-06-16T11:26:56.000408Z

またネタ振りだけですが、nekoがバージョンアップですね。実用性上がってたらいいですね。http://clojure-android.info/blog/2015/06/16/neko-400alpha1-changes-and/?utm_source=dlvr.it&utm_medium=twitter

athos 2015-06-16T21:56:27.000409Z

たしかに僕の発言はschema.core/validateにしかフォーカスしてなかったですね。s.c/defnとかまで考慮すればそうですね。

ayato_p 2015-06-16T23:20:49.000411Z

Android は完全に Kotlin が制圧し始めている感じあって、 Clojure で書けて嬉しいのは Clojure 使いだけみたいな感じですよね。 僕らは嬉しくても Android やってる人が流れてくることはないんだろうなーという目で見ています。 > neko