I think this is pretty cool. Instead of thinking it as functions on
steroids, I'd prefer looking at it as a powerful callable abstraction.

How does macroexpand-time validation play with apply (the function)? What
happens if I do (map some-outfn coll) ?

Also implicits confused me a bit. At first I thought they were parameter
defaults. But it seems they're some sort of inheriance mechanism for
callables.

BTW, thanks for taking the time to write a detailed readme. I know this is
a young project and it's probably in heavy development. It shows
professionalism (yes, professionalism in an open source context is a thing)
on your part.


On Thu, Oct 30, 2014 at 3:08 AM, Diogo Almeida <diogo...@gmail.com> wrote:

> Hi everyone,
>
> A couple of coworkers and I were chatting about what some of our biggest
> problems with (our) Clojure code was, and came up with this:
> https://github.com/diogo149/outfn ! We just finished making it, so we
> haven't really battle-tested it, but we would love to hear feedback and
> general thoughts about the approach, and possibly have it evolve with the
> community.
>
> The readme has a bunch examples, so I won't copy-paste it all here, but
> here is a list of things that we are hoping to acheive:
> - bad/inconsistent variable naming
> - function call clarity
> - function dispatch based on inputs instead of arity and allowing the
> usage of a threading macro no matter the order of arguments with 0 overhead
> - static DRY verification
> - decomposing big let blocks easily
> - dependency passing without coupling (and anything that makes us want to
> use a :dynamic var)
> - automatic creation of glue code
>
> Some of our favorite examples:
>
>
> - keyword arguments for function call clarity
>   (do-something :user-map x :password-list y)
>
>
> - decomplecting order from function arguments:
>     (defoutfn map-v2.0
>       "Like map, but better"
>       [f coll]
>       (map f coll))
>
>     ;; threading in a collection
>     (->> 5
>          range
>          (map-v2.0 :f inc :coll)) ;; (1 2 3 4 5)
>
>     ;; threading in a function
>     (->> 5
>          (partial +)
>          (map-v2.0 :coll (range 5) :f)) ;; (5 6 7 8 9)
>
>
> - macroexpand-time validation
>     (defoutfn outfn
>           "what's up doc"
>           [foo]
>           :foo)
>
>         (when nil
>           ;; this doesn't get run
>           (outfn :fo 2))
>         ;; Error!  Invalid set of keys #{:fo} for #'outfn.core/outfn
>
>
> - declarative function calls without glue code
>     (defoutfn foo-fn {:output :foo}
>       "Docstring"
>       ([a] 3)
>       ([b] 4)
>       ([c d] 5))
>
>     (defoutfn bar-fn {:implicits #{#'foo-fn}}
>       "what's up doc"
>       [foo] foo)
>
>     ;; Look ma, no glue code
>     (bar-fn :foo 2) ;; 2
>     (bar-fn :a nil) ;; 3
>     (bar-fn :b 42) ;; 4
>     (bar-fn :c 11 :d 22) ;; 5
>
>     ;; I don't need to know what bar-fn needs - decoupling
>     (bar-fn :foo 2 :a 3 :b 4 :c 5 :d 6 :q 72) ;; 2
>
>     ;; Laziness is a virtue
>     (bar-fn :foo 42 :a (throw Exception.)) ;; 42
>
>  --
> 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.
>



-- 
Kind Regards,
Atamert Ölçgen

-+-
--+
+++

www.muhuk.com

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