freenode/#lisp - IRC Chatlog
Search
21:25:43
aeth
Writing a Common Lisp library that's AGPL is like writing a library that only runs under Aeth Common Lisp. Most Common Lispers will just move on and find something else or write their own.
21:25:55
verisimilitude
In all this time, I'm the only person who bothered to write a rather comprehensive library instead of leaning on Ncurses, so I'm not worried.
21:26:26
aeth
As soon as there's a demand, someone will look for libraries, find yours, look at the license, close the tab, and write their own.
21:26:45
verisimilitude
Currently, I'm working on Gopher protocol tools in Common Lisp, which is something else I've seen nothing of; that will also be AGPLv3.
21:27:13
jmercouris
verisimilitude: I would strongly urge you to re-evaluate the licenses and rethink it
21:27:13
verisimilitude
There's some interest, apparently, since jmercouris wanted me to relicense it.
21:27:34
jmercouris
Its not like I plan on making a killer TUI program, and becoming a millionaire off off it leaving you in the dust :D
21:28:14
jmercouris
Lisp is particularly problematic with multilicensed libs because of how it compiles
21:28:33
jmercouris
so the moment you bring in one of these libraries, your whole program is infected
21:28:36
aeth
verisimilitude: The problem with Common Lisp is that everyone has their own library that implements, usually without documentation, 80% of something. A different 80% for each library, and often very styllistically different from each other.
21:29:37
jgkamat
that's very true, usually when I find a library I end up rewriting it anyway because it's not good enough
21:29:41
aeth
jmercouris: The point of an AGPL library (rather than application) *is* to infect your entire program. It's inherently political.
21:31:08
aeth
I wrote maybe the 10th defun wrapper that exists (define-function) because all of the existing ones were a mess (and half of them were also a licensing mess)
21:32:15
verisimilitude
I see this push to be ``nice'' and use permissive licenses to be mostly for the benefit of large companies that want free work. That's the entire reason the term ``Open Source'' exists.
21:32:16
aeth
jgkamat: whose code? verisimilitude's? verisimilitude doesn't write particularly idiomatic Common Lisp. Although I can't really throw stones there, given that I use the define-function macro extensively instead of defun in quite a few places.
21:33:06
jmercouris
which makes some trades, because I try to make it emacsy in its configurability, but still Common Lisp
21:33:32
jmercouris
would you look at this: https://github.com/atlas-engineer/next/blob/master/source/keymap.lisp
21:33:36
jgkamat
I don't remember, it was a while ago and I didn't have enough time to keep looking, if I take another look I'll ping you the parts that I find confusing. The thing that really confused me was the RPC/xml/whaever bridge, I couldn't understand or change any of that from tinkering
21:33:56
verisimilitude
I make an effort to use only the COMMON-LISP package if I can and I try to write it portably, according to the standard. I dislike when a program sees fit to pull in a single convenience function from some library; that's an inconvenience.
21:34:03
aeth
jmercouris: a simple defstruct definition (i.e. no fancy slot stuff) seems very weird to me
21:34:11
jmercouris
The XML RPC bridge is a *very* complex problem, so I don't think it is fair for you to judge a piece of code you do not understand
21:34:22
aeth
jmercouris: I personally only use defstruct when a slot's :type is very important and probably (at least in SBCL) optimized
21:34:42
jmercouris
aeth: has to do with using it as keys in a hash table, and how the equality operators traverse
21:35:13
aeth
jmercouris: so in the function key, why do you push in a loop to an outer list instead of using something like loop's collect?
21:36:10
aeth
https://github.com/atlas-engineer/next/blob/9e5f377815b5648927f74fa7d90e0b1ff7b78b11/source/keymap.lisp#L98-L118
21:36:23
verisimilitude
Currently, it's just a Gopher menu parser; I don't think I'll be adding much more; one feature that will be neat is having :MENU to represent menus or a list, representing the contents, instead.
21:36:49
aeth
(you have to type 'y' before linking to a line on Github so it isn't nonsense as the file changes in later commits... I actually prefer Gitlab's UI here, where they actually have a "Permalink" button)
21:37:09
verisimilitude
As for the Gopher server, I'd want to have my own network library before I start on that; USOCKET is just BSD Sockets, which I dislike.
21:37:30
Bike
you could hypothetically do (loop for key-chord-string ... for keys = (cl-strings:split key-chord-string "-") for key-chord = ... collect (serialize-key-chord key-chord)
21:38:29
aeth
verisimilitude: I also dislike usocket. It's unfortunate that we're going to have two parallel efforts here, although even without licensing issues we probably would have two parallel efforts anyway because of my very different requirements.
21:39:16
jmercouris
here is the "mess" jgkamat is referring to: https://github.com/atlas-engineer/next/blob/master/source/remote.lisp
21:39:25
aeth
jmercouris: it absolutely is a mess because you use symbols instead of keywords in LOOP and that is the tabs-vs-spaces holy war in Common Lisp
21:39:55
aeth
jmercouris: It's weird to see you document a function in comments in the docstring position. I think normally they're documented above with ;;; in comments or in docstrings where you currently have your comments
21:40:40
Ukari
is anyone also get a weird indentation like me when using uiop:define-package, https://plaster.tymoon.eu/view/1259?
21:40:43
jmercouris
oh I know, it was at a time where the aesthetics of the docstring de-denting to the 0th column really annoyed me after one line
21:42:01
verisimilitude
It depends on how much work it is; if I'd licensed SHUT-IT-DOWN, which just abstracts over how to exit the implementation, under the AGPLv3, almost no one would use it, since it's so small, but with CC0 no one has a reasonable objection, really.
21:42:02
aeth
Ukari: I also get that weird indentation and have to manually override it. It's especially weird since it's just &rest clauses so I'm not sure why SLIME wants to indent the first element of a &rest
21:42:03
jmercouris
aeth: I've recently tried to make my comments conforming to the "standard" convention
21:43:57
aeth
verisimilitude: The thing is, no one will use your AGPL library even if it is large and non-trivial. I am writing a very large and very non-trivial framework in Common Lisp and if it wasn't MIT licensed then even fewer people would pay attention to it than the few that currently do so.
21:44:54
aeth
verisimilitude: if you don't write for yourself in the world of CL libraries it can be very demoralizing
21:46:19
jmercouris
I will not lie, I am upset by the fact that you picked this particular point as a mess
21:46:28
aeth
jmercouris: if you're *only* writing for yourself, then there's no reason to even release the source, so (A)GPL is fine
21:46:31
jmercouris
because it is something that took almost a year of effort and a lot of deliberation
21:47:01
jgkamat
fwiw, though, I think almost all code is a mess, almost everything out there is pure garbage
21:47:03
jmercouris
and it was based on the reccomendation of a member of this community who I very much respect as one of the best Lisp developers and researchers of our time
21:47:41
jmercouris
basically the XML RPC abstraction is so that a platform port can be independent of the Lisp Core
21:48:07
aeth
jgkamat: Most code just never reaches a level of polish that I would personally call "quality"
21:48:11
jmercouris
a separate program that controls the GUI effectively listens and communciates back and forth between the Lisp core
21:48:17
verisimilitude
I'll let you know when it's finished or at least given an initial release, jgkamat; you refer to CL-GOPHER, right?
21:48:37
aeth
jgkamat: calling most things a "mess" would probably be going too far, though. You should hang out in #clschool if you want to see what complete novice code looks like
21:48:58
jmercouris
jgkamat: here is the very short explanation; https://github.com/atlas-engineer/next/tree/master/ports
21:49:36
aeth
jmercouris: I suspect that most code issues can be addressed in a matter of days/weeks.
21:49:41
jmercouris
it is in *no* way a mess, I know messes of code that I have written in the past, but remote.lisp, and the logic there, is not one of them
21:52:15
aeth
jmercouris: afaik accessors are *both* "higher level" and more efficient, essentially killing any reason to use slots except if the slot doesn't have a writer, which can be worked around by doing something like (... :accessor %foo :reader foo) and not exporting %foo.
21:52:52
jmercouris
I usually use with-slots to avoid having to write (slot object) over and over again
21:53:21
aeth
with-accessors is more verbose because you can't do (foo bar) and have to do ((foo foo) (bar bar)) but I wrote a with-accessors* macro for that. https://gitlab.com/zombie-raptor/zombie-raptor/blob/1eb5040be02827c65246d515e2764a6ea8ba9ad9/util/util.lisp#L408-424
21:54:02
aeth
So I just do (with-accessors* (foo bar (baz quux)) foobar ...) and it gets turned into (with-accessors ((foo foo) (bar bar) (baz quux)) foobar ...)
21:54:38
verisimilitude
Note that CL-GOPHER would be distinct from a client written with it, which I'd pull in ACUTE-TERMINAL-CONTROL for, jgkamat. So, the code that understands Gopher would be distnict from the mass that combines it, an interface, and network code.
21:55:46
aeth
jmercouris: I do need to spin off the general purpose utils from my game engine, though. They're mostly complete, unlike the engine, and they really are general purpose.
21:55:52
jgkamat
jmercouris: https://github.com/atlas-engineer/next/blob/master/source/remote.lisp#L43 is this binding to 0.0.0.0 ?
21:56:59
verisimilitude
Also, here's something amusing: It was easier in my light testing to use SB-EXT:RUN-PROGRAM to call netcat than it was to use SB-BSD-SOCKETS or USOCKET, which I find pitiful.
21:57:14
aeth
verisimilitude: It's actually an issue. There are absolutely users who cannot use my MIT-licensed code because it is not public domain, such as the SBCL team if they wanted to use one of my utility macros internally to the implementation.
21:57:52
jmercouris
but if it were public domain, someone could modify it, put a lot of work into it and even make a profitable lisp business!
21:58:08
verisimilitude
Well, I agree that BSD or MIT is too restrictive for my tastes as well, but I wasn't aware you were serious.
21:58:09
aeth
verisimilitude: So I wasn't mocking you, I was just correcting jmercouris, who might have been.
21:58:14
jmercouris
I'm sorry that was a bit uncalled for, this is a political topic, and we know how it goes...
21:59:42
jmercouris
It was however not meant to be an attack against you, but rather the GPL, which I have grown so strongly to distate, I will not talk anymore about this though as it is both off-topic, and a conversation without resolution
21:59:56
jgkamat
jmercouris: have you seen http://web.archive.org/web/20181130174629/https://bouk.co/blog/hacking-developers/
22:00:22
jmercouris
jgkamat: I am already aware yes, hence the desire to move to unix domain sockets
22:00:59
jmercouris
jgkamat: it is something wasamasa pointed out months ago as a potential vector, and since he made a very good case, I took him quite seriously
22:01:29
jgkamat
I think you could migitate it by just specifying localhost instead of binding to 0.0.0.0
22:01:36
aeth
Anyway, as far as I'm concerned, with-accessors* itself is too trivial to be copyrighted. The only non-trivial thing it does is check the types if it's a bindings list instead of a binding symbol, e.g. the (baz quux) in (foo bar (baz quux))
22:03:19
jmercouris
if you think that is enough to solve the issue, test it and submit a PR, they are welcome..
22:04:51
jgkamat
it won't solve the issue, but it will at least make people on your subnet not be able to do RCE on you
22:05:19
jmercouris
then it is pointless, usocket must support unix domain sockets, that is the only fix
22:06:01
jmercouris
I also refuse to use SBCL specific unix domain sockets, I want cross implementation compatibility
22:08:42
jmercouris
yes, but please, rephrain from calling it a mess, it isn't a very nice thing to say
22:46:17
jackdaniel
each time I think about projects I work on I see an endless ocean of mess. I think it is something inherent to lisp.
22:48:07
jackdaniel
otoh usually it is a constructive mess (i.e when I spend a reasonable amount of time to grok things I see that doing it this paticular way makes a lot of sense), so the perceived mess-ness is just ignorance. but sometimes it is just a mess which needs to be fixed.
22:48:55
jmercouris
jackdaniel: since you are here, I can ask you, this McClim TUI that you developed, would you suggest it for usage?
22:49:56
jackdaniel
I've just shown a proof of concept that a reasonable CLIM backend could be written for CLIM
22:50:58
jackdaniel
that said I have a semi-working backend for McCLIM which renders to a console - it is not published nor workable yet though
22:52:51
jmercouris
my memory is usually pretty good, so when you said that you had not worked on a TUI backend for McCLIM I was very confused
22:55:26
jackdaniel
gilberth: I'm really tired right now, but if you don't mind I'll bother you with some ideas in a few days (CLIM related) - is that fine?
23:23:33
gilberth
Perhaps Tipsy_2 was the most offensive person I could find at that time [something like ten years ago] to demonstate incremental redisplay upon?
23:25:13
Xach
gilberth: I don't think so. I think it was a one-time visit to check on and disparage the CL array indexing decision.
23:27:35
gilberth
And then my wife complains all the time about me, that I would remember everything. Seems like Xach is worse. :) But then I am olde.
23:27:38
Xach
gilberth: No, but the nick is not familiar, so if they visited more than once, it did not make much of an impression.
23:29:56
Fare
(my understanding is that CMUCL's CLOS has experienced breakage but nobody's there to fix it anymore)
23:30:34
Fare
but when I code some Lisp, these days it's Gerbil for new code, or Common Lisp for my legacy code.
23:31:32
Xach
"A Lisper has gone / Uninterned from this mortal package / Yet not GC'd / While we retain pointers to his memory"
23:33:21
Fare
At least nikodemus, stassats and Xach are pissed at me. At least Xach for good reasons.
23:33:50
Fare
(Not sure about Nikodemus, I discovered only 10 years later that he was pissed at me, he never told me why exactly.)
23:34:47
Fare
The biggest item that would justify a modicum of backward-incompatibility would be cross compilation.
23:35:26
Fare
Totally non-deterministic: everything is done via side-effects to the current image state.
23:36:00
Fare
more as a necessary consequence of the architecture: you can never protect against someone or something side-effecting the environment.
23:36:32
Fare
if anyone dynamically calls ASDF while some of the reader variables are bound to non-standard values, the result can be "interesting".
23:38:02
jmercouris
and for all of those that have complaints, valid they may be, but it is easily top 3 most meaningful contributions to the Lisp Ecosystem, so thank you for that
23:38:04
Fare
well, most people most of the time have the discipline and decency not to do anything too bad with the lisp image while they build. But that's not a guarantee.
23:38:43
jmercouris
whatever, you are frequently credited with UIOP/ASDF, and I think those are of great value, so thank you
23:38:55
aeth
as far as being indexed at 0 instead of 1... that is the worst reason to not use CL... just write a macro or inline function to do the (1- index) translation if it's too hard to translate the elaborate 1-based algorithm (e.g. a matrix one).
23:41:00
aeth
Yes. I actually use a matref macro (has to be a macro because of the inline expansion limit) for matrix code because all of that (well, the raw math and algorithms as opposed to concrete implementations) is 1-based and I don't want to make a logic error translating it.
23:41:38
jmercouris
(defun cool-aref (array &rest subscripts) (aref array (mapcar (lambda (i) (+ i 1)) subscripts))) :D
23:42:35
aeth
As far as problems with ASDF, the (nitpick) problem I have with it is that it's not at all easy to add support for other languages, even though it seems to be theoretically possible.
23:49:01
Fare
though if I were still maintainer, I'd consider moving this support from a cffi gadget to asdf itself. Maybe. Or then again maybe not.
23:50:03
aeth
Well, my main complaint is that it seems to require adding a lot of different things in many different places, which requires a decent understanding of ASDF internals, at least when I was looking into it. There isn't just one or two places to add methods.
23:51:18
Fare
the ASDF internals are still underdocumented. But at least there are documents that explain them nowadays. That used not to be the case.
23:52:57
Fare
I would recommend my 25-page ASDF 3 essay if you want to grok ASDF internals. At least the parts that discuss the object model.
23:53:44
Fare
it's weird, but it was a very interesting invention by danb (as inspired by Kent Pitman).
23:57:46
jasom
aeth: I've settled for just adding a dummy lisp file that invokes a native build system (such as make) when loaded.
23:58:45
Fare
Retrospectively, one thing that surprised me most was that in the old MIT Lisper vs Unix hacker debate, the Lisper claimed to be seeking the "Right Thing" when the hacker was looking for "good enough", but ASDF 1 and most Lisp libraries I've seen were much more "good enough" than "the Right Thing". Maybe it's a generational thing, too. I became a Lisper in the 2000s, when that debate was from the 1980s.
23:59:39
jasom
Fare: though it should be said that nearly all build systems are more "good enough" than the "Right Thing"
0:00:03
jasom
at least partly because it's very hard to be both very general while still doing the "Right Thing"
0:01:11
Fare
and as far as ASDF goes, there was a clear mission creep as to what makes it "good enough" from danb's ASDF 1.85 to Gary King's 1.369 to my 2.000 to my 2.26 to my 3.0.1 to my 3.1.2 to my 3.2.0 to my 3.3.0.
0:03:18
aeth
jasom: adding a dummy lisp file doesn't work for my purposes because this is a language that's compiled to CL so there is a two step foo.bar -> foo.lisp -> foo.fasl process.
0:04:18
jasom
aeth: that should still work just fine, as dependencies are loaded before a given file is compiled, right?
0:05:54
Fare
I remember doing that. Maybe it was for the Python to CL implementation, maybe for the FORTRAN to CL compiler. Or maybe some FFI that compiled to C.
0:09:38
Fare
aeth, if generated, the foo.lisp will typically be redirected by the OUTPUT-TRANSLATIONS.
0:27:40
aeth
jasom: The problem is that to transparently use ASDF to have foreign-to-CL dependencies you need to be able to have a simple foo.bar -> foo.lisp -> foo.fasl and have ASDF treat those FASLs as if they were CL
0:29:21
aeth
Fare: output-translations doesn't sound familiar so I think I might have been missing that.
0:30:42
aeth
Fare: Another problem I was getting a lot iirc is that I couldn't modify ASDF and use those modifications in the same place iirc. The issue was adding support for .scm files in general in cl-scheme while also having some of the implementation of cl-scheme be in .scm files
0:31:28
aeth
(cl-scheme is not my intended final name but if I say the intended final name that I have in mind, the likelihood of the domain names being grabbed greatly increases)
0:32:01
aeth
(I say intended because I can't even search for the domain name without increasing the chance of it being camped by expressing interest in the domain name so it could already be taken...)
1:10:36
verisimilitude
You haven't matured much from what I see, Xach, with my experiences with you.
1:15:25
no-defun-allowed
Immaturity isn't a problem, but to not seem unfriendly you have to hide it behind a lot of wit at least.
1:41:41
Fare
aeth, I sorry was not on IRC. I don't know what you're trying to do, but whatever it is, I will gladly help with telling you what to do and not to do with ASDF.
1:42:39
Fare
I also have suggestions of names for a Scheme implementation. Such as "Agley" (because "The best laid schemes o' mice an' men / Gang aft a-gley.").
2:00:35
aeth
Fare: One reason why I want to do proper ASDF integration is that then you could run any library in Quicklisp that doesn't use elaborate (especially tree-walking) macros with a few wrapper files that could probably even be semi-automated.
2:03:49
aeth
One of the reasons it's incomplete is because I need to solve the integration and performance issues before finishing it.
2:05:58
aeth
Fare: it looks like what I was trying to do last time I attempted anything was a perform compile-op and perform load-op for a new scheme-source-file class. I was also looking into output-files. I wasn't aware of output-translations.
2:07:10
aeth
Iirc, what made me stop experimenting is that I didn't know where to put the method definitions. These have to somehow run *before* the defsystem afaik, but I can't just put them above the defsystem in the .asd file.
2:08:40
aeth
The real challenge is that probably half of the code implementing the Scheme will eventually be in Scheme .scm files, but the scm-to-lisp compilation function will be done in a .lisp file as part of the implementation details.
2:08:54
aeth
I guess I'll have to break it into at least two systems, possibly with two separate .asd files.
2:20:45
Fare
aeth, do you want to discuss it on a video call? It might be faster to get information through.
2:22:26
Fare
And yes, often separating your code in multiple .asd files can help, especially if you need to use defsystem-depends-on.
2:26:04
aeth
hmm... I don't think I have a functional web cam on my desktop. I purchased a microphone for gaming, but not a camera. Years ago, I plugged in a bunch of old webcams from probably pre-2005 and none of them had functional Linux drivers.
5:50:39
beach
Hey gilberth. I am preparing my ELS talks, so I spend more time in #sicl than here in #lisp.
6:51:44
dtw
There are several command-line parser packages in Quicklisp distribution but I have been unhappy with all of them: too fancy object system which I don't want to use, too much automatic messages or return value is unnecessarily complicated to parse. So I have used my own parsers which I have now generalized and published as a package: https://github.com/tlikonen/cl-just-getopt-parser Maybe someone wil find that useful.
7:08:28
verisimilitude
This only affects those who live in countries that don't recognize public domain.
7:21:52
flip214
Is there a YAML parser that records line numbers on the input, so that meaningful error messages on _semantically_ invalid data can be thrown?