News for hackers. Stuff that matters.
Re:Channels in Common Lisp by wtbob on Thursday January 19, 2017 @11:49PM (#13441793)
This illustrates the power & the problem of Common Lisp: the power is that it really is easy to add channels (and pretty much every other feature) to the language yourself; the problem is that it's generally easier to write your own code to do this than to use (or fix …) someone else's.

I've experienced exactly this: I too looked at ChanL. In my case it had a bug for one of my use cases, and it was honestly easier to roll my own channels (with, of course, their own bugs) than to understand & fix ChanL's bug.

The problem is that this leads to a proliferation of different libraries, all doing similar things. The power is that one really can write just about anything, and it will work well enough for your use case.

Re:Channels in Common Lisp by reikonomusha on Friday January 20, 2017 @12:20AM (#13441873)
As you sort of imply, it doesn't help that each implementation is half-baked, incomplete, and unmaintained after 16 months.

I've seen similar libraries that do the following, for example:

* Serialization and deserialization

* Promises

* Generators

* CPS

Somehow none of these "100 line wonders" make it into idiomatic usage, despite their purported utility.

These channels as presented don't solve many problems well. They will be very slow and contentious, they will be expensive to make, and they will not guard against memory ownership issues because you're just passing pointers to objects around, which message passing is supposed to solve.

But, it'll become another library on Quicklisp that 3 people use and that people's applications will inadvertently depend on.

Lisp is a fantastic language for many things, including a plethora of production applications, but it being a local optimum for exploratory programming means we get lots of very incomplete, scratch-an-itch code that is pawned off as a library intended for mass consumption. In fact, the author links to his GitHub repository, where you find exactly this random assortment of disparate utilities.

If I had my way, the rhetoric of this post would be closer to a pedagogical exposition of channels, how they're used, what their benefits are, a proof-of-concept implementation, and a non-trivial example application. I would vehemently stay away from having the thesis be anything about Lisp or the ease of implementing small POCs in Lisp.

Re:Channels in Common Lisp by jonathanstrange on Friday January 20, 2017 @04:59AM (#13442686)
it doesn't help that each implementation is half-baked, incomplete, and unmaintained after 16 months

I couldn't agree more, that's the real problem with CL and the reason why I keep using scheme and Racket. (Well, that and the antiquated package/unit systems with multiple options and caveats.) Just take a look at cross-platform user interface library bindings, there are seemingly plenty of options, but in the end they are all some sort of unmaintained hacks that may or may not work on some implementation/platform combo. Threading itself is another example, by the way. Almost any addition to the outdated standard is a mess that sometimes works, sometimes doesn't work.

It's a pity, since CL implementations are of such a high quality (e.g. SBCL) and it offers everything a programmer can dream of.

Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @12:25AM (#13441881)
This implementation is yours to maintain, that's why it's simple enough to make that possible. There is plenty of room for simple. They allow building networks of cooperating threads, which is the purpose. Erlang isolates, Go doesn't, in the end I like the choice.
Re:Channels in Common Lisp by reikonomusha on Friday January 20, 2017 @12:29AM (#13441888)
Copy-pastable blog post code is the antithesis of good software engineering practices. DRY, encapsulation, reusability, broadly applicable abstractions, and so on should ideally be heralded as the thing to strive for.
Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @12:47AM (#13441927)
I don't agree. As long as you understand the code and it solves your problem, owning is an advantage. Why is it so important to you that no one steps out of line and tries to use their brain as more than an answering machine?
Re:Channels in Common Lisp by smallnamespace on Friday January 20, 2017 @01:50AM (#13442104)
> As long as you understand the code and it solves your problem, owning is an advantage

Because the cost of acquiring an understanding of code that solves your problem might be much higher in Lisp than other languages, if the hypothesis is correct that the language facilitates the creation of bad half-baked libraries.

Just to give a somewhat figurative example, the jungle is a much more hospital environment for life in general than temperate environments (it's warmer, full of nutrients, bathed in constant solar energy).

However most humans didn't manage to really expand into the jungles successfully until the advent of modern medicine, because the life there was so prolific that there were all sorts of nasty parasites and diseases, and everything you build sinks into the jungle within years.

Lisp is like that jungle -- everything just grows fantastically easily, but paradoxically that makes it harder to separate the chaff from the wheat.

Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @08:39AM (#13443666)
But these are symptoms; you're still basically arguing that Lisp gives the user too much power. And that's a valid perspective. I don't agree that a language can give the user too much power. Building tools for someone who's supposedly not as smart as your self is a great ego boost, and that's about it.
Re:Channels in Common Lisp by reikonomusha on Friday January 20, 2017 @01:08AM (#13441981)
The less I have to maintain fundamental abstractions, the more energy I can spend building on top of these abstractions. There's a name for this: NIH [0].

While there are some folks [1] that have the time, energy, and brilliance to build things from the ground up all themselves, I unfortunately do not. Moreover, in a collegial work environment, this means the burden is on me to test, document, communicate, and educate on this library. There's enormous additional complexity and risk that comes with building from scratch things like these which change the whole programming paradigm of your application—again, especially in a coworking environment.

[0] https://en.m.wikipedia.org/wiki/Not_invented_here

[1] Donald Knuth and Fabrice Bellard, to name a few.

Re:Channels in Common Lisp by taeric on Friday January 20, 2017 @01:28AM (#13442037)
It is a fallacy that you are not maintaining something with your dependencies. It is the hope that you get nothing but benefits from depending on someone else to build strong dependencies. It is as true of a reality that they are pursuing goals that are not yours.

It is odd, because the "micro library" world ostensibly fixes this by greatly limiting the scope of a dependency. However, it also encourages chaining yourself to many other entities. And it is always the mistakes that people remember, such that anyone that has been burned will remember how it was enabled by micro libraries.

Re:Channels in Common Lisp by reikonomusha on Friday January 20, 2017 @02:59AM (#13442328)
You are maintaining the API boundary between your application and your dependencies. I certainly do not maintain (in the most common sense of the word) my operating system source code, my compiler source code, my server source code, etc.

I have no problem with micro-libraries. In fact, I developed on the notion of the micro-est of libraries: a library generator that gets down to function-level dependencies [0].

[0] http://web.archive.org/web/20140711172208/http://symbo1ics.c...

Re:Channels in Common Lisp by TeMPOraL on Friday January 20, 2017 @05:04AM (#13442698)
> my operating system source code, my compiler source code, my server source code, etc.

Actually, you sort of do. You may not know it yet, if you were fortunate enough to never hit a problem with an update to one of them.

Re:Channels in Common Lisp by taeric on Friday January 20, 2017 @11:54AM (#13445074)
Exactly. And I wasn't trying to be anti micro services or libraries. Just pointing out that confirmation bias is a big reason some folks are against them.

It is amplified when folks push them with no caveats. Some of us remember being burned in ways this allowed.

Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @12:05AM (#13441837)
What you're saying is really that it's too powerful for it's own good. And I agree. But what's good for Lisp isn't necessarily good for me, I prefer more power to one size fits all libraries. I think it comes down to experience in the end; the more you have, the more unwilling you are to give it up.
Re:Channels in Common Lisp by reikonomusha on Friday January 20, 2017 @12:26AM (#13441885)
I disagree about it being "too powerful for its own good". If it was, we would have a magnificently efficient and useful library come out of this that brings Go- or Erlang-style programming to Lisp. But alas, this code does not.

A lot of hardcore Lisp aficionados do the equivalent of a mathematician writing a "sketch of a proof" and saying "left as an exercise", without ever writing the details of the proof. It's occasionally aggravating when you pull in a library and discover that this is the case.

To be clear, there are many Lisp folks do not do this. Some go the full mile and implement something completely and robustly. Edi Weitz has been the canonical example in the community.

Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @01:10AM (#13441989)
Completely, what is that? Doesn't that depend on context (as in problem being solved)? Simple is often faster, and these are pretty fast without even trying. There is plenty of room for simple, fast enough code. Owning code you understand is an advantage.
Re:Channels in Common Lisp by rtpg on Friday January 20, 2017 @04:06AM (#13442510)
Completeness means being as performant as possible on all the possible axes.

You might want simplicity, but users also want performance. So a complete solution will be performant, but simple.

You have one use case, but other users have others. A complete solution will work in as many use cases as possible given its constraints.

Scala's parser combinators are a good example of a complete solution. It offers the "elegant" solution of parser combinators. But it also offers an implementation of this using things like Packrat parsing that are extremely efficient.

The non-complete example of this is someone who writes a parser combinator library that is simple, but simply not performant for real world use. For example, you might write a simple version in Python, but not properly apply TCO and so your parser can't handle deeply nested structures because of a stack overflow.

---

With regards to owning code, I remember hearing that it took 9 years of the initial publication of quicksort for there to be a bugfree implementation of it. Even easy things can be tricky.

Re:Channels in Common Lisp by jonathanstrange on Friday January 20, 2017 @05:02AM (#13442692)
Completely, what is that?

Well, comprehensive unit tests for a start...

Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @07:21AM (#13443263)
What's comprehensive? Doesn't that too depend on context? I'm with Kent Beck on tests. I'll test as much as I have to too move forward with confidence. In the end, my goal is to write working code, not tests.
Re:Channels in Common Lisp by TeMPOraL on Friday January 20, 2017 @05:06AM (#13442706)
> A lot of hardcore Lisp aficionados do the equivalent of a mathematician writing a "sketch of a proof" and saying "left as an exercise", without ever writing the details of the proof. It's occasionally aggravating when you pull in a library and discover that this is the case.

That's exactly "too powerful for its own good". It's so easy to write a half-assed sketch of a library that nevertheless gives you some new powerful feature, that some people end there, and publish the sketch that was enough for their use case.

Re:Channels in Common Lisp by wtbob on Friday January 20, 2017 @10:13AM (#13444329)
I guess I should have mentioned that Lisp is my language of choice. I like the ease with which I can implement anything. But it does have a cost: everyone else implements everything himself, too.

I actually think Quicklisp has helped. It's even easier to do (ql:quickload "foo-lib") than it is to write my own foo library.

Re:Channels in Common Lisp by nickik on Friday January 20, 2017 @06:37PM (#13447844)
Everybody can do that stuff in Clojure too, and it does not suffer from the same thing CL does. It seems to me that it is a culture/ecosystem problem more then anything else.
Re:Channels in Common Lisp by junke on Friday January 20, 2017 @01:19AM (#13442013)
> The problem is that this leads to a proliferation of different libraries, all doing similar things.

This is not "left-pad" either. I'd say you have the same problems in C or C++, where people are reluctant to depend on libraries they don't control or appear to be bloated (boost, etc.). As far as Lisp is concerned, this post talks about the problem more directly: http://fare.livejournal.com/169346.html

Re:Channels in Common Lisp by dfox on Friday January 20, 2017 @12:56AM (#13441949)
In this case particular case, what is being shown is that channels in itself are pretty simple concept, especially when done on top of language with preemptive multithreading. Same thing can be implemented in essentially any imperative language with necessary primitives by code that looks more or less exactly same.
Re:Channels in Common Lisp by codr4life on Friday January 20, 2017 @01:32AM (#13442048)
C with pthreads won't look the same, I know because I've tried hard. Java most definitely won't. Which languages are we talking about here anyway?
Re:Channels in Common Lisp by teddyh on Friday January 20, 2017 @03:10AM (#13442356)
This is known as the “Lisp Curse”:

http://www.winestockwebdesign.com/Essays/Lisp_Curse.html