You could travel to the future and use ClojureScript with Kotlin as 
compilation target and a version of clojure.spec which resolves a subset of 
known constructs to Kotlin type annotations at compile-time :-p

Actually that idea of having a library of compile-time-recognizable spec 
constructs (like nil? string? or instance? predicates) is something I would 
like to see in ClojureScript today. It would generate type annotations for 
Closure Compiler to catch some class of simple bugs at compile time. But 
this is off-topic for this thread...

On Friday, October 21, 2016 at 7:41:31 PM UTC+2, Colin Fleming wrote:
>
> I tried it a couple of years ago, and my impressions were more or less the 
> same as CircleCI's here 
> <https://circleci.com/blog/why-were-no-longer-using-core-typed/>. 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 <https://github.com/arohner/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 <merelyap...@gmail.com 
> <javascript:>> 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.
>>>
>>>    1. 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.
>>>    2. 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.
>>>    3. 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.
>>>    4. 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.
>>>    5. 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.
>>>    6. 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.
>>>    7. #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.
>>>    8. 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.
>>>    9. 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 clo...@googlegroups.com 
>> <javascript:>
>> 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 <javascript:>
>> 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 <javascript:>.
>> 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