Absolutely, both that and the dogfooding are compelling arguments :-)

On 21 October 2016 at 20:04, Colin Yates <colin.ya...@gmail.com> wrote:

> "making me sad" is unsustainable - problem solving with 1s and 0s is
> hard enough as it is without using demotivating tools :-).
>
> On 21 October 2016 at 18:40, Colin Fleming <colin.mailingl...@gmail.com>
> wrote:
> > I tried it a couple of years ago, and my impressions were more or less
> the
> > same as CircleCI's here. I found the type annotation burden much higher
> than
> > using a typed language such as Kotlin, the type checking was very slow
> and
> > the boundary between typed and untyped code was really onerous. Ambrose
> has
> > done some great work recently though, so I should check it out again.
> > However my general feeling is that retrofitting something like Typed
> Clojure
> > onto an existing language is always going to be more difficult and
> fraught
> > with problems than having a language which was designed with the types in
> > mind in the first place.
> >
> > Another possibility which I haven't had time to explore properly is Allen
> > Rohner's spectrum.
> >
> > Honestly, the easiest solution to my problem is probably just to use
> Kotlin,
> > which was designed by JetBrains for almost exactly my use case, has great
> > IDE support, and has a lot of smart people working full-time on it.
> However
> > that has a couple of problems: 1) it would make me sad and 2) I would no
> > longer be dogfooding Cursive all the time, which is a valuable source of
> > finding bugs during development. But at least I'd be spending all my
> time on
> > developing Cursive features, and not chasing NPEs or investigating all
> this.
> >
> > On 21 October 2016 at 19:20, Josh Tilles <merelyapseudo...@gmail.com>
> wrote:
> >>
> >> Out of curiosity, did you try Typed Clojure? It certainly has its rough
> >> edges, but you sound willing to bear the burden of annotating code with
> >> types (at the top-level, at least) and I think its treatment of Java
> interop
> >> does what you want: unless instructed otherwise, the typechecker assumes
> >> that arguments to Java methods must not be nil and that any Java method
> may
> >> return nil.
> >>
> >> On Thursday, October 20, 2016 at 8:39:04 AM UTC-4, Colin Fleming wrote:
> >>>
> >>> I recently spent a bunch of time researching exactly this. My
> motivation
> >>> was that my main project, Cursive, suffers from a ton of NPEs which I
> find
> >>> very difficult to manage. I wanted to see how difficult it would be to
> have
> >>> a typed Clojure-like thing, using something similar to Kotlin's type
> system.
> >>> Kotlin uses a type system which is similar to Java and has Java
> interop as a
> >>> primary goal, which I would also need since Java interop is essential
> to me.
> >>> It fixes a bunch of flaws in the Java type system and adds new
> features like
> >>> nullable types, which I now find it difficult to live without.
> >>>
> >>> Before anyone asks, spec is not useful for me because it relies heavily
> >>> on generative testing to increase your confidence in your functions. I
> can't
> >>> use generative testing because my application is tied to a large Java
> >>> codebase which I cannot model to any useful degree. Essentially, spec
> >>> recommends runtime tests at the boundary of your system, and nearly my
> >>> entire system is interop boundary. I'm not interested in runtime checks
> >>> except where absolutely necessary - Kotlin does this for me
> transparently,
> >>> spec doesn't.
> >>>
> >>> Here's a short list of my findings. I'm happy to expand on any of these
> >>> points if anyone is curious. It bears repeating - Java interop is
> >>> non-negotiable for me, and that makes a lot of this harder than it
> would be
> >>> otherwise.
> >>>
> >>> Disclaimer: I'm no programming language expert. This was hard for me,
> and
> >>> a surprising amount of it was new to me. I'd appreciate any
> corrections or
> >>> clarifications.
> >>>
> >>> Type systems are hard. I for one didn't appreciate the complexity that
> >>> goes into making them easy to use. Don't be fooled by the 20-line
> >>> implementations of Hindley-Milner.
> >>> In particular, generics are very hard, and variance for generic objects
> >>> (i.e. the intersection of generic objects and OO) is the source of much
> >>> difficulty.
> >>> Type systems are split into two main camps - nominal typing (like Java,
> >>> where the types are identified by names) and structural typing, where
> the
> >>> type of an object is defined by it's "shape", like Go's interfaces.
> >>> One of the major benefits of Clojure is its heterogeneous collections,
> >>> a.k.a. "just use a map". This is very difficult to maintain in a
> type-safe
> >>> manner without losing most of the benefit.
> >>> There are two main things I was interested in from a type system - type
> >>> checking (i.e. making sure that your program's types are correct) and
> type
> >>> inference (working out what the types of things are from the code, so
> you
> >>> don't have to annotate everything). Type checking is relatively
> >>> straightforward, but type inference can be very hard indeed.
> >>> Much of the complication comes from the need to interop with Java.
> >>> ML-style interface essentially doesn't work if you want to maintain
> >>> compatibility with Java since it cannot be interfaced in a useful way
> with
> >>> nominal OO systems. In particular, method overriding is basically
> impossible
> >>> to represent.
> >>> #6 implies that you cannot have a language with good Java interop and
> >>> global type inference, i.e. you will definitely be annotating your
> function
> >>> parameter types, and your function return types. I'm ok with this
> since IMO
> >>> it's a good practice anyway.
> >>> Once you start thinking about the fact that you no longer have
> >>> heterogeneous collections, and start thinking about what the
> alternatives
> >>> would look like, you start to realise that you'd end up with basically
> the
> >>> ML family style of data types - homogeneous collections, typed tuples
> and
> >>> ADTs. I'm actually ok with that too, since they're a very nice set of
> >>> primitives and I think they probably represent 95% of how people use
> >>> Clojure's collections anyway.
> >>> Structural typing seems like it might be a good fit for something like
> >>> Clojure's maps. However, mixing structural and nominal typing and OO
> seems
> >>> to be the path to madness.
> >>>
> >>> I think that's it. This is still a project I'd like to tinker with at
> >>> some point, but I think it's fair to say that I dramatically
> underestimated
> >>> the amount of work a useful Java-compatible type system would be. I
> still
> >>> think it seems like a nice point in the language design space though,
> which
> >>> is curiously unfilled on the JVM (some of you may have noticed that I
> >>> basically want F# with nullable types).
> >>>
> >>> Cheers,
> >>> Colin
> >>>
> >>> On 16 October 2016 at 00:14, Didier <did...@gmail.com> wrote:
> >>>>
> >>>> I know a lot of people like to say how unhelpful Java like static
> typing
> >>>> is, and only more powerful type systems of the ML family add value,
> but I've
> >>>> been wondering recently if for Clojure it wouldn't make more sense to
> simply
> >>>> extend the type hints to enable an optional Java like static typing
> scheme.
> >>>>
> >>>> It is my understanding that ML style static typing is incredibly
> >>>> difficult to add properly and without compromise to a dynamic
> language. That
> >>>> doing so limits the scope of type inference, rendering the task of
> adding
> >>>> type info more tedious then in ML languages themselves.
> >>>>
> >>>> ML style static typing provide enhanced safety grantees, but seem to
> add
> >>>> too much complexity to Clojure to be practical. What about a Java like
> >>>> static typing scheme though?
> >>>>
> >>>> I haven't found in practice that the safety of Clojure was an issue,
> as
> >>>> the REPL workflow tend to promote quite a lot of testing. So I'm not
> too
> >>>> worried about needing the state of the art of provable correctness
> for my
> >>>> programs. What has been a biggest cause of issue to me was
> refactoring and
> >>>> shared code base across a team. Those last two use cases are actually
> pretty
> >>>> well handled by Java like static type checking. Is it a powerful type
> >>>> checker, not really, but it enables most trivial type errors to be
> caught
> >>>> early, and it allows easier integration points for other devs to
> follow, as
> >>>> well as documentation for functions, better tools support and easier
> >>>> refactoring, while also enabling performance optimizations.
> >>>>
> >>>> I have limited knowledge in typing systems, and have no idea how easy
> it
> >>>> is to implement them, but as a user of Clojure, I feel like I would
> find an
> >>>> optional Java like static typing a great addition, one that I am more
> >>>> willing to use and benefit from then Typed Clojure's more complex ML
> style
> >>>> type checking.
> >>>>
> >>>> What do other think?
> >>>> Can anyone with better knowledge tell me if this would be feasible or
> if
> >>>> adding such gradual typing system is effectively as hard as adding ML
> style
> >>>> type checking?
> >>>>
> >>>> --
> >>>> You received this message because you are subscribed to the Google
> >>>> Groups "Clojure" group.
> >>>> To post to this group, send email to clo...@googlegroups.com
> >>>> Note that posts from new members are moderated - please be patient
> with
> >>>> your first post.
> >>>> To unsubscribe from this group, send email to
> >>>> clojure+u...@googlegroups.com
> >>>> For more options, visit this group at
> >>>> http://groups.google.com/group/clojure?hl=en
> >>>> ---
> >>>> You received this message because you are subscribed to the Google
> >>>> Groups "Clojure" group.
> >>>> To unsubscribe from this group and stop receiving emails from it, send
> >>>> an email to clojure+u...@googlegroups.com.
> >>>> For more options, visit https://groups.google.com/d/optout.
> >>>
> >>>
> >> --
> >> You received this message because you are subscribed to the Google
> >> Groups "Clojure" group.
> >> To post to this group, send email to clojure@googlegroups.com
> >> Note that posts from new members are moderated - please be patient with
> >> your first post.
> >> To unsubscribe from this group, send email to
> >> clojure+unsubscr...@googlegroups.com
> >> For more options, visit this group at
> >> http://groups.google.com/group/clojure?hl=en
> >> ---
> >> You received this message because you are subscribed to the Google
> Groups
> >> "Clojure" group.
> >> To unsubscribe from this group and stop receiving emails from it, send
> an
> >> email to clojure+unsubscr...@googlegroups.com.
> >> For more options, visit https://groups.google.com/d/optout.
> >
> >
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To post to this group, send email to clojure@googlegroups.com
> > Note that posts from new members are moderated - please be patient with
> your
> > first post.
> > To unsubscribe from this group, send email to
> > clojure+unsubscr...@googlegroups.com
> > For more options, visit this group at
> > http://groups.google.com/group/clojure?hl=en
> > ---
> > You received this message because you are subscribed to the Google Groups
> > "Clojure" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to clojure+unsubscr...@googlegroups.com.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to