On Sun, Mar 8, 2009 at 12:45 PM, André Thieme
<splendidl...@googlemail.com> wrote:
>
> I like that Clojure is a dynamically typed language.
> Even in dynamic languages it is possible to find out a lot more
> about the code itself than one may think on a first glance.
> Clojure already supports type hints that can make code run
> faster. But what if we could add a soft layer of static typing
> into the compiler, by making promises to it, which can then be
> enforced?
> For example, we could promise that foo will always be a string:
> (def+ foo "Hello Clojure")
>
> Same for functions, about its parameters and return values.
> Note that I am not proposing a concrete syntax here, this is just
> a sketch, so we can talk about it:
> (defn reverse
>  "Returns a seq of the items in coll in reverse order. Not lazy."
>  [#^Collection coll]
>    (reduce conj () coll))
>
> For all functions in the core.clj which don’t have side effects we
> could make this promise. In that case the compiler could check
> if foo is ever used in a position where not a string is expected.
> And it could check if the return value of a function is an argument
> to another function, and then see if those match:
>
> (+ (count foo) 15) ==> 28
>
> (dec foo)  ==> compile time error, can't subtract 1 from a String.
>
> (count (count foo)) ==> compile time error, as count returns a
> number, not a collection.
>
> This would keep Clojure still extremly dynamic. One exception is:
> functions and vars for which we gave promises can’t be changed
> anymore during runtime. But these compiler checks would only
> be made when in a form there only occur vars/functions which all
> made promises about their types. These types can be inferred by
> Clojure. For example in (def+ foo "Hi") we see that foo refers to a
> string. As Clojure is mostly a functional language anyway it will
> not cause much harm that foo can’t be changed anymore.
> In principle each var that was def’ed should be seen as a constant.
> As long we are debugging our code it can of course make sense
> to change those vars.
>
> Anyway, with this proposal a good bit of code can be checked for
> type correctness and there is another positive aspect:
> the Clojure editors could make use of it.
> When we write
> (count<space>
> the editor will not offer us auto-completion for vars that we promised
> to be numbers or microwave objects. This feature would allow the
> IDE to do more refactoring and more code completion at edit time.
>
> I am proposing a complete optional mode. Into the metadata one could
> add a promise and state the explicit types, or add just an empty
> promise
> and have the Clojure compiler then to infer the correct times (it
> could
> give warnings if this were not possible).
> This way only people who like these features could use them.
> Even if the core.clj and the whole load of clojure-contrib changed in
> a
> way to fully support soft static typing, then still a user can decides
> to
> never put promises into his code, and so he wouldn’t even notice that
> there is some (soft) mechanism for static typing.
>

> >
>

--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to