<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div> </div>
<blockquote type="cite"><div style="font-family:"Courier New";">Inline clarifications. <br></div>
<div style="font-family:"Courier New";"> </div>
<div style="font-family:"Courier New";">On Thursday, May 19, 2016, Stelian Ionescu <<a href="mailto:sionescu@cddr.org">sionescu@cddr.org</a>> wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div style="font-family:"Courier New";"><u></u><br></div>
<div><div> <br></div>
<blockquote type="cite"><div style="font-family:'Courier New';">I don't mean any other language, but I do mean any other relatively modern one. Rust, JavaScript, Clojure are maybe some examples off the top of my head.<br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Hans gave a good example about Clojure. Javascript, with <a href="http://Node.js/npm">Node.js/npm</a>, is in an even worse position.<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div style="font-family:'Courier New';">Either modules are somehow first class (by way of having modules-as-function-dictionaries), or the respective packaging/loading/whatever systems will at least let you know that about unsatisfied/mismatched versions.<br></div>
<div> <br></div>
<div>I think in light of this discussion you can boil down one's opinion on this matter to one of three alternatives:<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>1. Lisp+ecosystem and associated libraries are problematic in that it's not possible to load multiple versions of a library due to the way CL packages work. (Packages or systems aren't first-class modules. Namespace names are global and aren't late-bound.)<br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Hans described the QA problem with loading two versions of the "same" library in the same process: if data structures from one version are fed into the other version, all sorts of problems can happen, and worse, they can happen without noticing. Think of what can happen if the semantics of a string or integer slot changes.<br></div>
<div style="font-family:'Courier New';"> <br></div>
</div>
</blockquote><div> </div>
<div> See below. <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><blockquote type="cite"><div>2. There's something like a SocialProblem (TM) where Lispers lack (a) versioning discipline, (b) dependency versioning discipline which exacerbates issues like inadvertent multiple loading, or incompatible loading of libraries. <br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Semantic versioning won't help you without automatic tools to determine if the API of a library changed in an incompatible way, e.g. if a function removed a keyword arg, or changed the type of an existing arg.<br></div>
<div style="font-family:'Courier New';"> <br></div>
</div>
</blockquote><div> </div>
<div>I would say that semvers should in principle help you detect incompatibilities, but as you hinted with "illusion", maybe these in practice can't be trusted or relied upon generally.<br></div>
<div style="font-family:"Courier New";"> </div>
<div style="font-family:"Courier New";"><br> <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>3. There's actually no issue in principle: inconsistencies need to "just" get fixed by the library vendor/user, or better tooling needs to be used to track your project's direct and transitive dependencies. <br></div>
<div> <br></div>
<div>It's my personal opinion, as is evident in previous messages, that I think 1 & 2 are issues.<br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">You didn't give an example of how exactly those two things are a problem, and how adding those features would solve the problem(s).<br></div>
</div>
</blockquote><div> </div>
<div>#1: Assuming that there isn't incompatible passing of data, if A depends on B1 and C depends on B2, and in isolation A-B1 works/passes tests, and C-B2 works/passes tests, then A-B1 and C-B2 loaded together (assuming a non-existent Lisp) should work fine. The problem being addressed is lack of synchrony in the universe of Lisp modules.<br></div>
<div> </div>
<div>(My first-order thought is that even incompatible data wouldn't be an issue if those data types are properly encapsulated in classes or structures, by virtue of the fact that those types become distinct by way of different names. I envision that only untyped things could cause problems, like [ap]-lists, strings, etc.)<br></div>
<div> </div>
<div>#2: If there was diligence is properly versioning libraries, and diligence in specifying dependency version requirements, then detection of issues could happen. This is solving recognition of a possible issue. <br></div>
<div> </div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>Some additional food for thought:<br></div>
<div> <br></div>
<div>* Lisp is old. Some libraries go back to the 80s.<br></div>
<div> <br></div>
<div>* Not everything is very strictly maintained. Some useful libraries haven't been updated for some 5-10 years.<br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">What useful libraries that actually need updates haven't been updated ?<br></div>
</div>
</blockquote><div> </div>
<div>I'll get back to this when I'm at my computer next. <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>* Like many other languages, Java is continuously updated, and as are the libraries of its large standard set. While Java/etc libraries certainly can and do depend on third party libraries, the majority of depended-on libraries are standard ones. This is obviously not the case for Lisp. <br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Just look into Maven packages. Large parts of the Java standard library are obsolete and people use third party libraries(just like with CL). In some cases those libraries make it back into the standard(<a href="http://www.joda.org/joda-time/">http://www.joda.org/joda-time/</a>), but that's rare.<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>* Because library distribution wasn't a relatively solved problem until recently in Lisp history, some library authors unfortunately include copies of Lisp libraries as a part of their library tree.<br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">That's very rare, in my experience. Do you have examples ?<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>* Hot patching libraries makes this all a ton more complicated in principle. <br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Where did you see this?<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';"> <br></div>
</div>
</blockquote><div> </div>
<div>For these last two questions, I don't have the examples off hand and unfortunately it was at a company I no longer work at.<br></div>
<div> </div>
<div>Including: ALEXANDRIA has been included directly before. I don't remember which library it was. I only detected it because of function redefinition warnings on first uncached build.  There were other examples but I don't recall. <br></div>
<div> </div>
<div>Hot Patching: I think (??) some linear algebra library was being hot patched for some specific use of that library.<br></div>
<div> </div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><blockquote type="cite"><div>* Visible libraries are global to the entire Lisp universe. (Unlike Python where you can, just within a file, import and late-bind a namespace.)<br></div>
<div> <br></div>
<div>* Tangential: the whole name/nickname collision issue. Package-local nicknames are a language extension which could solve this, even if not (yet?) universally used. <br></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">Local nicknames would make certain things more convenient, but what does that have to do with the original question, versioning ?<br></div>
</div>
</blockquote><div> </div>
<div>It was tangential to packages and names of things.  <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;" defang_data-gmailquote="yes"><div><div style="font-family:'Courier New';"> <br></div>
<blockquote type="cite"><div>Making it easier to work in this large, old, and diverse ecosystem of implementations and libraries seems important to me, and versioning is one useful and tangible way to make things easier. <br></div>
<div> <br></div>
<div><div style="font-family:'Courier New';">Robert<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div style="font-family:'Courier New';">On Wednesday, May 18, 2016, Scott L. Burson <<a>Scott@sympoiesis.com</a>> wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><div dir="ltr"><div><div style="font-family:'Courier New';">I don't understand when you say this is "not an issue that one runs into writing in another language and associated ecosystem".  AFAIK, in Java, you can have only one version of a given package loaded into the JVM at any one time.  Am I missing something here?<br></div>
</div>
<div style="font-family:'Courier New';">-- Scott<br></div>
</div>
<div><div style="font-family:'Courier New';"> <br></div>
<div><div style="font-family:'Courier New';">On Wed, May 18, 2016 at 11:41 PM, Robert Smith <span dir="ltr"><<a>quad@symbo1ics.com</a>></span> wrote:<br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><div dir="ltr"><div style="font-family:'Courier New';">I really honestly felt that this rebuttal was very unhelpful. I basically got from it:<br></div>
<div><ul><li>Lisp isn't designed for this kind of use.<br></li><li>Since Lisp wasn't designed for this, the problem is not Lisp, it's your use of Lisp.<br></li><li>To solve the problem (which is not Lisp's), fix (third party) inconsistencies yourself. Because it's not a Lisp problem, two systems depending on two Lisp-simultaneous-incompatible versions of a system is a problem. (Even though each system+dependency combination is perfectly valid in isolation.)<br></li><li>Or, in the end, change your entire operating system to a completely different one with completely different philosophies.<br></li></ul><div>This kind of response is just very practically a non-starter for most people. Maybe that means Lisp isn't the right tool for much of the world, like startups, then. Which advances my point, I think, in the original Quora post. (But I admit this thread is about package or system versioning, not the original Quora point.)<br></div>
<div> <br></div>
<div>I wrote some stuff inline below.<br></div>
<div><div style="font-family:'Courier New';"> <br></div>
<div><div style="font-family:'Courier New';"><span>On Wed, May 18, 2016 at 10:14 PM, Faré <span dir="ltr"><<a>fahree@gmail.com</a>></span> wrote:</span><br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><span><span>On Wed, May 18, 2016 at 5:49 PM, Robert Smith <<a>quad@symbo1ics.com</a>> wrote:<br> ><br> > On Wed, May 18, 2016 at 4:57 AM, Alessio Stalla <<a>alessiostalla@gmail.com</a>><br> > wrote:<br> >><br> >> The stance on packages found in the mentioned Quora post is based on the<br> >> old misconception about packages being modules, or "software packages" in<br> >> the Linux distribution sense. They're not. They are really just namespaces,<br> >> containers of symbols. So it does not make any sense, to me, that they have<br> >> versions. Software has versions, not names.<br> ><br> <br> <br> </span><span>> Systems are what should get versioned but systems are not what are referred<br> > to by source files. Systems largely coordinate the compilation and loading<br> > of files. Source files generally have no notion of a system, actually, which<br> > may be what is ultimately problematic. Packages are referred to by source<br> > files, however. When I said packages, I meant it, and it was not a<br> > conflation with the notion of a system.<br> ><br> </span>Why should source files know about systems?<br> Why should packages know about systems?<span></span></span></blockquote><div> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>Maybe they should, maybe they shouldn't. But the crappy packages-as-namespaces system isn't cutting it for large programs, and modules usually naturally have an associated namespace, but there's no formal correspondence between packages and systems. But more often than not there is an implicit association, judging by how most modern Common Lisp libraries are written. So maybe there's value in taking advantage of that correspondence.<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><span><span>> At the companies I have worked in, we rake in 100s of systems, which consist<br> > of n*100s of systems where n is the average number of packages per system.<br> > These version collisions happen enough, and we are lucky when they're not<br> > silent.<br> ><br> </span>Was it in CL? Was it all in the same process? CL is not designed for<br> these kinds of things. <span></span></span></blockquote><div> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>CL in the same process.<br></div>
<div> <br></div>
<div>CL very clearly wasn't designed for a time where 100s of packages would be available and simultaneously usable.<br></div>
<div> <br></div>
<div>But I'm not ready to concede and say "well, Lisp is only good for five or six massive packages or systems written by a few guys, like the good ol' days".<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><span><span>> Often enough, it's an extremely subtle issue that system A depends<br> > on {system B at time T1} and system C depends on {system B at time T2},<br> > where T1 and T2 correspond to different versions of system B, even if not<br> > explicitly labeled as such.<br> ><br> </span>A and C are incompatible. You need to fix A, B and/or C.<br> The build system can record this incompatibility and issue an early error<br> when you try to build them together. It can't fix A, B and/or C for you. <span></span></span></blockquote><div> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>A and C are incompatible only because of this whole thing we are talking about. Obviously they're incompatible. That's the whole problem. Saying "Fix A, B, C" is, to me, declaring that this whole thing isn't a problem, and the problem is library writers. Why can't A and C depend on whatever they want at some time? They of course can, but it's non-sense to think people will rename their namespaces every iteration of their software. That's just not how Lisp code has been written.<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><span><span>> Let's suppose we simplify the problem however and assume that B has been<br> > properly versioned in time, and systems A and C refer properly to the<br> > correct version of system B as a dependency. Even then, they will not be<br> > able to be simultaneously loaded in a functionally correct fashion. (They<br> > *can* both be loaded, but you'll do some clobbering of state along the way.)<br> ><br> </span>No. The build system can error out and<br> tell you the easy way that you have to fix your bugs<br> before you discover it the hard way</span></blockquote><div> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>The build system erroring would be a step above the status quo. But maybe there's not actually a logical error. We are only considering it an error because of the way packages work in Lisp, no?<br></div>
<div style="font-family:'Courier New';"> <br></div>
<div> <br></div>
<blockquote style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;"><span><span>> Whether we think about modules as systems or as packages or as whatever, the<br> > problem would need to be addressed at the package level, if we are not<br> > assuming that we can't synchronize the universe of people writing Common<br> > Lisp.<br> ><br> </span>The packages have nothing to do with it, unless you fork B into B1 and B2<br> (or B1 and B, or B and B2).<br> <span><br> > Overall, I'd summarize as this. Whether we have the technology in the Common<br> > Lisp ecosystem to accommodate this problem or not, it's my opinion and the<br> > opinion of many of my colleagues that there is a problem for development<br> > teams making extensive use of open and closed source code. There definitely<br> > is not a discipline that you see with other languages and their ecosystems<br> > (JS/npm, Clojure, etc.) about proper versioning of systems and furthermore<br> > proper loading of the proper versions. I don't think that's debatable. The<br> > closest we have to this solution is relying on the global nature of a<br> > particular Quicklisp distribution, but not all Lisp software is free and<br> > open source, and even software within Quicklisp has tons of implied version<br> > dependencies.<br> ><br> </span>This is not a very Lisp-specific problem.<br> This is a problem with building software in general.<br> The correct approach is to fix incompatibilities,<br> not to try to deny their existence only to find out the hard way you can't.<br> <br> Google Bazel provides a good way to deterministically build software<br> that follows the correct discipline. So does NixOS. There may be other<br> such tools. Use them. <span></span></span></blockquote><div> <br></div>
<div style="font-family:'Courier New';"> <br></div>
<div>I don't know much about Bazel, and I know a little about NixOS. Regardless, this seems to be moving the problem into how we globally synchronize our systems. <br></div>
<div> <br></div>
<div>I am absolutely boggled by this attitude. This is an issue that one runs into when writing Common Lisp code, and not an issue that one runs into writing in another language and associated ecosystem. To me, that's a Lisp problem. We can do some creative academic definitions, I think, but it's a problem when choosing Lisp as a tool.<br></div>
<div> <br></div>
<div>I don't know. The original question I was answering was why Lisp isn't what we are all using today, and I think this weird thread serves as additional evidence.<br></div>
<div> <br></div>
<div>Am I way off base here?<br></div>
<div> <br></div>
<div>Cheers,<br></div>
<div> <br></div>
<div>Robert<br></div>
</div>
</div>
</div>
</div>
</blockquote></div>
</div>
</blockquote></div>
</blockquote><div style="font-family:'Courier New';"> <br></div>
<div><div> <br></div>
<div>--<br></div>
<div>Stelian Ionescu a.k.a. fe[nl]ix<br></div>
<div>Quidquid latine dictum sit, altum videtur.<br></div>
</div>
<div style="font-family:'Courier New';"> <br></div>
</div>
</blockquote></blockquote><div style="font-family:'Courier New';"> </div>
<div id="sig4916231"><div class="signature"> </div>
<div class="signature">--<br></div>
<div class="signature">Stelian Ionescu a.k.a. fe[nl]ix<br></div>
<div class="signature">Quidquid latine dictum sit, altum videtur.<br></div>
</div>
<div style="font-family:"Courier New";"> </div>
</body>
</html>