I've used `import-vars` before, most notably in `java-time`. Even though 
I've never had any problems with the imported vars, I'm aware many people 
dislike the method so I'm writing the APIs in `$project.core` namespaces 
now.

Would be great if anyone who had problems or is otherwise directly aware of 
the drawbacks contributed to the issue in the Potemkin project 
<https://github.com/ztellman/potemkin/issues/50>. I think Zach would be 
happy to include any and all real issues in the Potemkin's docs. 

On Wednesday, November 8, 2017 at 3:25:30 AM UTC+1, Didier wrote:
>
> I found private/public works fine. I put my public interface at the bottom 
> of the file with a nice comment header. Using another namespace like .impl, 
> I've always had the issue that nobody on my team can agree with what the 
> name convention should be for what an impl namespace should be called šŸ˜, 
> so private has had less controversy. It can lead to pretty large file, and 
> splitting namespaces across more then one file, even though supported, 
> messes up with a lot of tooling, so I also avoid that.
>
> I think, what I've struggled with is how to move an API to another 
> namespace, while maintaining backwards compatibility. This happens a lot 
> where I work, where we want to refactor the namespace structure, and move 
> things around, and rename namespaces, but we're not sure if there were 
> other packages that depend on it which would break. So I'd want to take the 
> existing namespace, and move all its vars in a new namespace, but where the 
> old namespace still exists as a frozen immutable interface that now maps 
> back to the new. Yet I've hesitated to use potemkin, because its non ideal. 
> I'm still hoping here for a better solution to this to show up.
>
> On Tuesday, 7 November 2017 13:42:16 UTC-8, Sean Corfield wrote:
>>
>> Iā€™m with Timothy (and Alex) on Potemkin. For me, itā€™s been the source of 
>> some very weird transitive dependency bugs as well as strange binding 
>> issues across a number of projects where it has been dragged in by various 
>> third party libraries (e.g., clj-http). Itā€™s made me very wary of it šŸ˜
>>
>>  
>>
>> I have ā€“ very occasionally ā€“ used (home-grown) functionality to ā€œimportā€ 
>> vars from one namespace to another, but without the watchers or any other 
>> ā€œmagicā€, and itā€™s been done only when the convenience of a loop to intern 
>> symbols dramatically outweighs the effort of writing the delegation 
>> functions by hand (expectations.clojure.test currently does that to expose 
>> much of the old expectations API as-is while Iā€™m transitioning how the 
>> library works). I consider it very much an interim/transition solution, 
>> that should be avoided in normal production code.
>>
>>  
>>
>> Sean Corfield -- (970) FOR-SEAN -- (904) 302-SEAN
>> An Architect's View -- http://corfield.org/
>>
>> "If you're not annoying somebody, you're not really alive."
>> -- Margaret Atwood
>>
>>  
>> ------------------------------
>> *From:* clo...@googlegroups.com <clo...@googlegroups.com> on behalf of 
>> Timothy Baldridge <tbald...@gmail.com>
>> *Sent:* Tuesday, November 7, 2017 11:11:14 AM
>> *To:* clo...@googlegroups.com
>> *Subject:* Re: Who Uses import-vars? 
>>  
>> I structure my code very explicitly. Normally the most common constructs 
>> are put in a single file named after the library itself (not in core.clj, 
>> do that half your files will be named core). 
>>
>> https://github.com/halgari/odin/blob/master/src/com/tbaldridge/odin.clj
>>
>> Anything not in the API that should be unpublished to users is in other 
>> namespaces that are imported and wrapped by vars in the main namespace. 
>> This does several things:
>>
>> * Keeps the public interface in one place
>> * Allows for a different public interface than the private one. Notice 
>> how Odin has its own version of `when`, pulling that off require a bit of 
>> careful macro usage, so I'd rather write that once under a different name, 
>> then rename it to `when`. 
>> * It's now simple to say "anything in this namespace is public and will 
>> not change"
>>
>> Core.async uses a pattern much like this, the API is in 
>> clojure.core.async, most of the logic is under *.async.impl.*. 
>>
>> I don't recommend potemkin's import-vars at all. Clojure vars were not 
>> meant to exist in more than one namespace at a time, so potemkin pulls of 
>> its magic by linking two vars via watchers. This means that changes to one 
>> var can cause side-effects in the other. In addition, bindings don't convey 
>> properly (AFAIK), so if you using bindings on one var, the changes won't be 
>> seen in the other var. Remember: import-vars doesn't actually import 
>> anything, it simply creates a new var in the current namespace and links 
>> the two via a two-way binding. It's quite the hack, imo. 
>>
>> So I have to agree with Potemkin's tagline on github: it's an idea that's 
>> "almost good". 
>>
>> Timothy
>>
>> On Tue, Nov 7, 2017 at 11:13 AM, Nick Mudge <
>> ni...@perfectabstractions.com> wrote:
>>
>>> I am interested to know if people/you use import-vars to decouple the 
>>> structure of code from its API. 
>>>
>>> import-vars is from the potemkin library: 
>>> https://github.com/ztellman/potemkin
>>>
>>> If you don't use import-vars how do you structure your code and provide 
>>> an API?
>>>
>>>
>>> -- 
>>> 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.
>>>
>>
>>
>>
>> -- 
>> ā€œOne of the main causes of the fall of the Roman Empire was thatā€“lacking 
>> zeroā€“they had no way to indicate successful termination of their C 
>> programs.ā€
>> (Robert Firth) 
>>
>> -- 
>> 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.

Reply via email to