On Monday, 5 August 2013 09:40:04 UTC+1, Korny wrote: > Agree that :use should be deprecated, mostly as it's quite a barrier to > folks new to the language that you need to know 3 different parts of the ns > macro before you start. > I really don't think :use was ever a significant problem for newcomers: it's fairly obvious what it does if you come from another language that has similar package-importing constructs. The majority of other languages behave more like "use" than "require".
To me the things that make Clojure namespace handling a nightmare for beginners are: - Bad error messages (no.1 problem!) - Confusion with keywords vs. symbols (why ":use" in ns declarations vs "use" at the repl?) - Confusion about quoting and when / where it is needed (again compared with "use" at the REPL) - Confusion about when you should use lists vs. vectors vs symbols etc., and how this interacts with the extra magic syntax like ":as" - Problems with circular loading of namespaces (and how this affects your code structure) I count myself as someone who was quite confused by all these things initially, but I never had a problem understanding ":use" as a concept. > However "objectively bad" is strong language indeed. ":refer :all" is > vital anywhere you want a DSL - if using something like Korma, for example, > you have 3 options : > > 1. Use :as and fill your code with ugly things like "(k/select user > (k/where {:name [k/like " fred"]}) > > 2. Use ":refer [select where like..." and almost every other symbol in > Korma - might be ok if you have a perfect IDE, but still needlessly verbose > > 3. Use ":refer :all". It's perfectly fine, IMHO, when used responsibly. > Absolutely agreed: method 3 is a decent approach for DSL scenarios. This is why I am in favour of keeping ":use" for such situations. There's no value in making a breaking change that removes a helpful syntactical feature (aside from wasting the time of people who like ":use", it will just make namespaces even more verbose and it will invalidate a lot of tutorials / example code which I don't think is very welcoming to newcomers either). For example, which is easier to explain to a newcomer: (ns foo (:use my.dsl) (:require [some.library :as bar]) (:import baz.java.Class)) (ns foo (:require [my.dsl :refer :all]) (:require [some.library :as bar]) (:import baz.java.Class)) The second version is more verbose, has more "magic keywords" (count them!), and is IMHO somewhat confusing in the sense that you are using ":require" to do two very different things. ":use" is a simpler and more concise syntax for what the ns declarations above are trying to express (and has the advantage of consistency with "use" at the REPL). Reductio ad absurdum: If we take the logic of deprecating ":use" and overloading ":require" to its logical conclusion, surely we should also deprecate ":import" and replace it with something like (:require [:java-package baz.java :java-classes [Class]])? Replacing ":import" in this way would also simplify ns declarations and make things easier for newcomers, right? :-) > - Korny > On 5 Aug 2013 09:09, "Anthony Grimes" <discip...@gmail.com <javascript:>> > wrote: > >> I can't think of a single good reason to not deprecate :use. :require can >> do everything :use could do now. >> >> This isn't about whether or not (:use ..) without :only is bad. I'd go as >> far as to say that outside of test files (and sometimes not even those) and >> repl sessions, :use without :only is objectively bad. Not much >> justification you can give me that'll make it unbad. But that isn't what >> this is about. Deprecating :use doesn't make doing the aforementioned bad >> thing impossible, and :refer :all was added to require for that specific >> purpose. :require still lets you do bad things if you really want to. All >> we're doing by deprecating :use is removing cruft and making things less >> complicated for new people. We currently have two things, and one of them >> does all the things the other one does and more, yet we still have both of >> them. >> >> Just my $0.02. >> >> On Tuesday, July 23, 2013 8:50:50 AM UTC-7, Greg wrote: >>> >>> I think I read somewhere that :use is no longer encouraged, but I could >>> be mistaken. >>> >>> From what I've read, it seems like most people agree that Clojure has >>> too many ways of including/importing/**referencing/requiring/using >>> things: >>> >>> http://blog.8thlight.com/**colin-jones/2010/12/05/** >>> clojure-libs-and-namespaces-**require-use-import-and-ns.html<http://blog.8thlight.com/colin-jones/2010/12/05/clojure-libs-and-namespaces-require-use-import-and-ns.html> >>> >>> >>> The above gives a very nice explanation of all the various difference, >>> but it also acknowledges their complexity. >>> >>> Since :use uses :require, and since :require can do everything that :use >>> can, can we simplify Clojure programming a bit for newcomers by deprecating >>> the use of :use? The situation in ClojureScript is even worse because it >>> adds :require-macros on top of all the other ways of including files. >>> >>> Ideally, it would be awesome if there was just a single directive for >>> everything, but perhaps there's some complicated low-level reason why >>> that's not possible. :-\ >>> >>> Thoughts? >>> >>> Thanks, >>> Greg >>> >>> P.S. If this has already been brought up you have my sincere apologies. >>> >>> -- >>> Please do not email me anything that you are not comfortable also >>> sharing with the NSA. >>> >>> -- >> -- >> 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/groups/opt_out. >> >> >> > -- -- 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/groups/opt_out.