<lotuseater>
ah now you have a memorable nickname :)
taiju has quit [Ping timeout: 246 seconds]
lisp123 has joined #commonlisp
<phantomics>
Hey everyone, is there a preferred library/macro to write paths for getting contents of nested plists? Like (get-lpath list :a :b :c) instead of (getf (getf (getf list :a) :b) :c)?
<lotuseater>
hey phantomics :)
<phantomics>
What's up
<lotuseater>
i just saw you wrote something and wanted to say hi
karlosz has quit [Quit: karlosz]
seok- has joined #commonlisp
CrashTestDummy3 has joined #commonlisp
<lotuseater>
and sry, i'm not aware of one, since i never got much into touch with plists
<lotuseater>
for the example you gave a recursive macro would be good maybe :)
CrashTestDummy2 has quit [Ping timeout: 252 seconds]
srhm has quit [Ping timeout: 252 seconds]
seok has quit [Ping timeout: 252 seconds]
<mfiano>
Can someone remind me of the extended keyword parameter syntax or point me to the relevant section?
<phantomics>
Thanks Xach
<mfiano>
I would like to write a method for #'shared-initialize that accepts non-keyword-interned &key arguments
srhm has joined #commonlisp
lisp123 has quit [Ping timeout: 265 seconds]
<phantomics>
But they mention that performance isn't their priority, in my case I know I'll always be using a plist so I could just write a macro for that case myself
<lotuseater>
having to do that all the time would be a bit noisy
<mfiano>
I see, yes, it is coming back to me now.
<lotuseater>
but could be concerned good style always provide them
<mfiano>
I haven't used this syntax in some years
<lotuseater>
oh ^^
<mfiano>
Thanks.
Guest76 has quit [Ping timeout: 256 seconds]
<lotuseater>
but (&key (a '())) would be helpful, so one knows from reading that there should go a list
<lotuseater>
like with :initforms in DEFCLASS
<lotuseater>
mfiano: and maybe you remember also that you can give a specific keyword predicate too as a third component
<mfiano>
In this case I have several methods defined on #'shared-initialize specializing on classes that are intended to be abstract mixin classes.
<lotuseater>
is SHARED-INITIALIZE called when some slot has :allocation :class ?
<mfiano>
To define these classes, a defclass-writing macro is used (instead of defclass), which canonicalizes some things. For example, specifying keyword-interned initargs has a high liklihood of clobbering sibling mixins
<lotuseater>
but sounds very reasonable for mixins
<mfiano>
So I must also be sure to do so in shared-initialize/reinitialize-instance/initialize-instance/etc
<mfiano>
Anywhere new initargs can be introduced
taiju has joined #commonlisp
<mfiano>
This is a complicated project I've been writing the design down for like 2 months now. Maybe one of these days said design will be solid enough to implement :)
<mfiano>
Anyway, thanks :)
<lotuseater>
I think CLOS and MOP are again of great help when it gets complex. :)
<mfiano>
Indeed. I am [ab]using both to the max here.
<mfiano>
_death: I take it there is no room for shorter syntax when A == B, correct?
<lotuseater>
very nice :D
yitzi has left #commonlisp [#commonlisp]
yitzi has joined #commonlisp
<mfiano>
forgive me for sinning with Algol
<_death>
mfiano: correct
<lotuseater>
_death: hm just a minor, wouldn't it be: (defun foo (&key (a b)) (list b)) (foo :a 42) => (42) ?
<lotuseater>
as long as b is defined before in context
<mfiano>
I read AMOP recently, and the authors made a seemingly bold claim that the MOP solves the problem in that no longer do you have to choose flexibility over performance. Anyone that knows the MOP knows that is not _all_ that bold :)
<lotuseater>
okay it compiles anyway, but gives a message about it
<_death>
lotuseater: your form has a different meaning.. it defines a FOO function with a keyword parameter named :A, a corresponding variable named A, and a default value form B
<mfiano>
lotuseater: No, this is the alternate semantics I was asking about.
<lotuseater>
okay it was just for me to get it right in my head
<_death>
lotuseater: if you look at the clhs page, you can see the BNF for &key
<mfiano>
&key ((a b)) means that the argument will be 'A and the parameter will be B, and bound to NIL if the argument is not supplied.
<_death>
lotuseater: in the sub-section for keyword parameters, an example is given that shows the corresponding long syntax for the short syntax you used
<mfiano>
or something. Too tired
<lotuseater>
i will
* lotuseater
is very happy to be allowed being around so many very capable people, honestly
rotateq has quit [Ping timeout: 246 seconds]
<lotuseater>
mfiano: how late is it for you now?
<mfiano>
This is a very nice feature for the rare occasions you need it
<mfiano>
0122 utc, not that it matters; i sleep when i am tired
<mfiano>
which is as soon as i finish documenting this design section
<lotuseater>
okay so +2h for me
<lotuseater>
hah from our discussion i tried a simple class slot with ":initarg name" so an instance value for this is given by "'name \"foo\""
<mfiano>
correct
<Josh_2>
Staying up to write documentation? Props to you
<mfiano>
Not documentation
<mfiano>
More like trying to piece pages of my thoughts together on paper before I write the next module
srhm has quit [Read error: Connection reset by peer]
<Josh_2>
Ah I see
<Josh_2>
Yeh screw staying up to write documentation :joy:
srhm has joined #commonlisp
<lotuseater>
mfiano: your "[ab]using to the limit" gets me to the song "Push it to the limit" ^^
<mfiano>
Naming things is hard, especially when the minimum description that conveys meaning is overly verbose.
<mfiano>
This is what keeps me awake at night :)
lottaquestions has joined #commonlisp
<mfiano>
overly verbose wouldn't be a problem if it weren't for a high-frequency client interface
karlosz has joined #commonlisp
<Josh_2>
%%%%%%thing
<Josh_2>
problem solved :P
<mfiano>
Designing and coding is usually easy in comparison with nomenclature. I would probably be a good mathematician if I gave it as much attention.
<mfiano>
This is where I sleep
<Josh_2>
Sleep well :wave:
<lotuseater>
naming everything with (gensym "THING"), problem (not) solved :D
<Josh_2>
I never thought of that, seems like a plan to me
<lotuseater>
ouman
<mfiano>
CL would be a cheater language for a code obfuscation challenge
<lotuseater>
so before (define-symbol-macro thing (gensym "THING")). this would be a line in the book "How to screw things up with elegance"
<Josh_2>
If you are gonna screwup might as well do it in style
<lotuseater>
one can also learn much by knowing how to *not* do something
<mfiano>
name everything with increasing levels of zero-width space characters
<mfiano>
including package-local nicknames, lexical variables, etc
<mfiano>
until you are left with as much zero space as possible
<mfiano>
also bonus points for also doing the same for the #\( and #\) dispatch characters
lottaquestions has quit [Ping timeout: 246 seconds]
tyson2 has quit [Remote host closed the connection]
waleee has quit [Ping timeout: 252 seconds]
Psybur has quit [Remote host closed the connection]
CptKirk has quit [Remote host closed the connection]
Everything has quit [Quit: leaving]
karlosz has quit [Ping timeout: 252 seconds]
karlosz_ is now known as karlosz
nature has quit [Ping timeout: 246 seconds]
lisp123 has joined #commonlisp
CptKirk has joined #commonlisp
karlosz has quit [Ping timeout: 246 seconds]
Alfr has quit [Remote host closed the connection]
karlosz has joined #commonlisp
Alfr has joined #commonlisp
lisp123 has quit [Ping timeout: 264 seconds]
<beach>
Good morning everyone!
<_death>
good morning (off to sleep ;)
jealousmonk has quit [Remote host closed the connection]
pranavats has left #commonlisp [Disconnected: Replaced by new connection]
pranavats has joined #commonlisp
Bike has quit [Quit: Lost terminal]
<phantomics>
Morning beach
semz has quit [Ping timeout: 246 seconds]
jkordani has quit [Ping timeout: 256 seconds]
semz has joined #commonlisp
CptKirk has quit [Ping timeout: 252 seconds]
taiju has joined #commonlisp
karlosz has quit [Ping timeout: 265 seconds]
Inline has quit [Quit: Leaving]
ggoes has joined #commonlisp
ggoes has quit [Remote host closed the connection]
taiju has quit [Ping timeout: 252 seconds]
ggoes has joined #commonlisp
ggoes has quit [Remote host closed the connection]
ggoes has joined #commonlisp
ggoes has quit [Remote host closed the connection]
ggoes has joined #commonlisp
lisp123 has joined #commonlisp
lisp123 has quit [Ping timeout: 252 seconds]
attila_lendvai has joined #commonlisp
taiju has joined #commonlisp
<lotuseater>
beach: If you don't mind, I wanted to ask you about the status and your plans with Gsharp. I recommended OpusModus (maybe you heard of it) to a very music-affine friend of mine who also works in that topic and he's already on Mac. I remembered your Gsharp project when he mentioned he used MuseScore.
<beach>
OK.
<lotuseater>
I wonder how much effort would be needed to port OpusModus for other implementations and Linux.
<beach>
I don't remember OpusModus. Let me Google it...
<beach>
It looks like a commercial program, no?
<lotuseater>
When someone hears `gsharp` it could be thought of a maybe new programming language by Microsoft accidently.
<lotuseater>
Yes it's commercial.
<lotuseater>
And I think they do it with LispWorks.
<beach>
Gsharp v2 has a new name: Clovetree
<beach>
I see.
<lotuseater>
oh okay good to know
<beach>
It is following the tradition of Rosegarden and Lilypond.
<lotuseater>
I saw when skimming through your repo files that you also implement things from Metafont. :) very interesting
<beach>
That stuff is obsolete.
<lotuseater>
okay I used some Lilypond before
<beach>
Just the name...
<beach>
When I started Gsharp, there was no good Music font. Now there is a free font and a good standard.
<lotuseater>
Oh right, now some years ago.
<beach>
Or, rather, there were music fonts, but they looked like crap on low-resolution displays.
<beach>
So the idea for Clovetree is to use McCLIM, the new open font standard, and the new open font. I forget the names of the standard and the font.
taiju has quit [Ping timeout: 246 seconds]
<lotuseater>
don't worry, I don't know the names at all for those
<beach>
Otherwise, I will simplify the concepts of Gsharp. It was a mistake to introduce the concept of a "segment" to the user. I did it because I thought I needed it for performance.
<beach>
Now, I am convinced it is not needed.
<beach>
SMuFL is the standard, I think.
<beach>
Leland is the font I think.
<lotuseater>
Is music one of your other special interests? Writing such applications requires also much domain specific knowledge.
<beach>
SMuFL has a lot of information on how glyphs fit together.
<beach>
Sort of.
<beach>
I noticed that OpusModus targets composers.
<beach>
But Clovetree is mainly meant for music engravers.
<beach>
And I took an interest in music engraving. First I read the book by Ted Ross, and that was interesting but very brief.
<lotuseater>
I remember reading about Knuth, when visiting him at home you have to make a organ pipe session playing with him. :)
<beach>
Now, there is the reference of music engraving: "Behind Bars".
<lotuseater>
okay for what are composers?
<beach>
There is software like OpenMusic that targets composers.
<lotuseater>
ah okay
<beach>
The problem is that composers know nothing about the layout of music scores.
<beach>
Whenever I say that in my talks, composers get very angry.
<beach>
But then I show them some examples, and they become very quiet.
<lotuseater>
oh I misread, so composers are a certain type of people
<beach>
Yes.
<beach>
It's the same difference between writers and typesetters.
<lotuseater>
or mathematicians and linotypists in pre-TeX times :)
<beach>
Sure.
<beach>
A composer is someone who knows about things like harmony and counterpoint. I have studied those a little bit, but not enough to be a composer.
<beach>
Music engraving, however, is something you can read up on and then implement the rules in software.
<beach>
"Behind Bars, the Definitive Guide to Music Notation"
<lotuseater>
237MB as PDF, maybe it has many high quality color pictures
<beach>
Almost 700 pages.
<beach>
No, just score snippets.
<beach>
To someone who is unfamiliar with music engraving as a domain (like for those composers who think they know everything) it is a very surprising read.
<beach>
So the main features of a program like this is to implement all these rules, with all the possible variations, while still allowing the user to tweak the result (because it is impossible to totally automate).
<beach>
I believe Common Lisp is absolutely ideal for stuff like that.
<beach>
I can't imagine what prompted the MuseScore developers to use C++. It seems like a masochistic choice.
<lotuseater>
I would have guessed you think similar about that. :)
<beach>
So what information are you looking for, and what are your plans? Maybe I already answered all your questions?
<beach>
I do think that Clovetree could become a "killer app" for Common Lisp.
<lotuseater>
I think so, and if not, I know where to find you.
<beach>
Sure.
<beach>
So how do you see your role in software like this?
<lotuseater>
I'm still not so good with McCLIM, but have learned from the examples.
<lotuseater>
My role? Maybe just with CL specific things.
<beach>
I mean, why were you interested in the status of Gsharp in the first place? Do you plan to re-implement OpusModus?
<beach>
Something else?
<lotuseater>
And maybe if you know the geometry "GeoGebra" I would like to have this in McCLIM too, so featuring 100% less Java.
<lotuseater>
ehm no, I wouldn't even know where to start
<lotuseater>
Maybe if you could need help.
<beach>
Maybe so. Clovetree is stalled at the moment because I am too busy with Gsharp, but maybe later.
<beach>
The main thing I want with Clovetree is better user gestures.
<lotuseater>
Or with SICL, which is your main project I guess.
<beach>
Oops.
<beach>
I mean "with SICL".
<beach>
*sigh*
<lotuseater>
I should try building Gsharp for trying it at the weekend to get a feeling.
<lotuseater>
Oh okay. ^^
<beach>
I am not even sure it still works.
<lotuseater>
It would also be nice making some nontrivial commit to SICL someday if needed.
<beach>
For you, you mean?
<beach>
Let me finish the bootstrapping procedure first.
<lotuseater>
Yes, but I don't see myself at such a level and don't want to screw things up.
<beach>
Once I finish bootstrapping, there will be tons of smaller, independent projects like a type of compiler optimization, or some other modules.
<lotuseater>
uii
<lotuseater>
I have no doubt you will be successful soon.
<beach>
It is hard stuff, but I think I can do it.
<lotuseater>
Anyway I hope I didn't interrupt you at important things.
<beach>
Not at all.
<beach>
I was watching a YouTube video about tones in Vietnamese.
<lotuseater>
So music or speaking out words?
<beach>
The latter.
<contrapunctus>
Someone working on another Common Lisp scorewriter?
<lotuseater>
I just know it's very very specific how words are emphasized in Mandarin.
<beach>
Bah, Mandarin has only 4 tones as I recall. Vietnamese has 6 or 8 depending on how you see it.
<lotuseater>
contrapunctus: I know just the two mentioned ones.
<beach>
Oh, I almost forgot: Happy equinox everyone!
<lotuseater>
oh sounds interesting, but maybe if I would learn an Asian human language it would be Japanese I think
Cymew has joined #commonlisp
<beach>
No tones in Japanese though. But no doubt some other difficulties.
<lotuseater>
Ah right, so now autumn meteorologically.
<beach>
Only in the northern hemisphere.
<lotuseater>
right
<beach>
I see it as giving back the sun to hayley and pillton. :)
<lotuseater>
I even got in touch with two other fellows from over there.
<lotuseater>
isn't a nickname for it "down under"?
<beach>
It is.
<beach>
I lived in Aotearoa for a year, and tried to organize a Kiwi Common Lisp meetup, but there are only around 5 Lispers within a 3 hour flight radius from Auckland. Very different from Europe.
<moon-child>
wow, you really have lived the world over
<beach>
5 countries on 4 continents.
<lotuseater>
I never lived in another country yet, but I would want to, if some interesting opportunity opens up and someone would need me.
taiju has joined #commonlisp
<lotuseater>
gilberth said jokingly to me organizing some CL meetup somewhere here central and invite some people, now that the situation gets hopefully better with time. but I would also travel for that to France if other costs are not out of my current financial range
<lotuseater>
but of course there's ELS too
leeb has joined #commonlisp
lisp123 has joined #commonlisp
<beach>
Yes, let's hope we get to go to Porto.
<lotuseater>
I assume you mean the city in Portugal.
selwyn has quit [Remote host closed the connection]
selwyn has joined #commonlisp
rgherdt has joined #commonlisp
<Duuqnd[m]1>
If I have two threads both writing to the same network socket using WRITE-SEQUENCE followed by FORCE-OUTPUT, is there any chance that will cause problems? (I'm using SBCL)
<hayley>
Don't Count On It(tm).
<hayley>
When in doubt with concurrent programs: Don't Count On It. How sockets interact with threads is somewhat undefined to my knowledge, so you best use a lock if you care.
<saturn2>
i think it probably won't crash, but the output will be a jumble
<saturn2>
not a good idea, in any case
<Duuqnd[m]1>
I would do that, but the part that writes to the socket is in a library that I don't really want to modify
<Duuqnd[m]1>
This program only has to run on SBCL (because I'm the only user) so I can live with some uncertainty
<hayley>
Can you grab a lock while calling out to the library?
<Duuqnd[m]1>
There's lots of functions that call the socket writing function and putting a lock around each one would be very inconvenient.
* lotuseater
now thinks again about zeromq
<Gnuxie>
hmm i wonder if the bridge is still broke like 3ric said
<hayley>
A: yes
<Alfr>
Duuqnd[m]1, if it's a gf, you could use :around methods.
kakuhen has quit [Quit: Leaving...]
<hayley>
Well, my apologies then. But having your program break because someone decided to change undocumented behaviour, or worse, having it break completely randomly (cause that's threading for ya), is also very inconvenient.
<lotuseater>
Alfr: so getting around having a gf? ^^ haha
<Alfr>
You're getting around having generic functions? What?
<Duuqnd[m]1>
It is indeed. I have to choose between blindly trusting SBCL or making the program much worse to use and I don't like either option. Maybe I'll just add locks in the library after all.
<lotuseater>
ah not important, was just about the "gf" abbreviation
<Alfr>
lotuseater, I know. :)
<hayley>
Is it necessary to have multiple threads use one socket though?
<Duuqnd[m]1>
All this is because if the socket connection dies while it's listening I have to try to send something down the socket for it to notice that it's dead.
<Duuqnd[m]1>
A separate thread that pings the server every 10 seconds was the first solution I came up with (admittedly not a great one but the whole program is a soup of bad decisions)
<Duuqnd[m]1>
I can hardly believe it held out long enough to bridge IRC and Twitch for the two days that ELS needed it
<Duuqnd[m]1>
I guess I'll be using the worst possible solution: Assume it works until it breaks.
<Duuqnd[m]1>
I'll probably end up replacing the library with my own thing anyway since CL-IRC doesn't seem to support SASL which Libera usually wants.
<hayley>
glhf
<Duuqnd[m]1>
Any suggestions for which gods to pray to for making this work?
<hayley>
Leslie Lamport?
<Duuqnd[m]1>
Sure
igemnace has joined #commonlisp
tyson2 has joined #commonlisp
tfeb has joined #commonlisp
<pjb>
Duuqnd[m]1: you can count on it, on the contrary: count that concurent write-sequence WILL send their data randomly mixed on the socket.
<pjb>
So you have a probability = 1 of that causing problems.
<pjb>
Duuqnd[m]1: definitely use a mutex when you want to write out to the socket.
<pjb>
Duuqnd[m]1: basically, as soon as you have a loop, it's not atomic. Obviously, write-sequence contains loops.
<pjb>
"atomic"
JooTvora[m] has joined #commonlisp
gxt has quit [Remote host closed the connection]
gxt has joined #commonlisp
tfeb has quit [Quit: died]
tfb has quit [Quit: died]
random-nick has joined #commonlisp
notzmv has joined #commonlisp
Qwnavery has joined #commonlisp
<Qwnavery>
lotuseater: hey
selwyn_ has joined #commonlisp
selwyn has quit [Ping timeout: 252 seconds]
selwyn_ has quit [Ping timeout: 265 seconds]
lisp123 has joined #commonlisp
lisp123 has quit [Ping timeout: 265 seconds]
selwyn has joined #commonlisp
tyson2 has quit [Remote host closed the connection]
selwyn has quit [Read error: Connection reset by peer]
<Cymew>
lotuseater: You were not alone in your reaction to that expression. I did a double take before I re-parsed it.
Qwnavery has quit [Quit: WeeChat 3.3]
Psybur has joined #commonlisp
cage has joined #commonlisp
cosimone has quit [Remote host closed the connection]
<lotuseater>
Cymew: good to hear
waleee has joined #commonlisp
nature has joined #commonlisp
doyougnu has joined #commonlisp
jealousmonk has joined #commonlisp
amb007 has quit [Ping timeout: 265 seconds]
amb007 has joined #commonlisp
Bike has joined #commonlisp
<Josh_2>
Good afternoon
waleee has quit [Ping timeout: 264 seconds]
lisp123 has joined #commonlisp
hendursa1 has quit [Quit: hendursa1]
hendursaga has joined #commonlisp
lisp123 has quit [Ping timeout: 252 seconds]
rgherdt has quit [Remote host closed the connection]
Everything has joined #commonlisp
<lotuseater>
Hi there Josh_2.
specbot has quit [Remote host closed the connection]
minion has quit [Remote host closed the connection]
minion has joined #commonlisp
specbot has joined #commonlisp
lisp123 has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
scymtym_ has joined #commonlisp
scymtym has quit [Ping timeout: 246 seconds]
scymtym_ has quit [Ping timeout: 252 seconds]
scymtym_ has joined #commonlisp
Lycurgus has joined #commonlisp
eddof13 has joined #commonlisp
Cymew has quit [Ping timeout: 252 seconds]
eddof13 has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
eddof13 has joined #commonlisp
nature has quit [Ping timeout: 252 seconds]
cosimone has joined #commonlisp
eddof13 has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
q3cpma has joined #commonlisp
<q3cpma>
Hello, I've finished my wordcount program (http://0x0.st/-Y-W.lisp), but it somehow manages to blow SBCL's 1GB heap just during the word gathering part while processing a 40 MB file. Any idea why?
eddof13 has joined #commonlisp
Mandus has quit [Remote host closed the connection]
<beach>
q3cpma: Please indent your code correctly if you want remarks on it.
<q3cpma>
Hmmmm? I'm using sly and emacs, and it looks nice here
Mandus has joined #commonlisp
<q3cpma>
Tabulation problem?
<beach>
Could be.
<beach>
Does it look fine when you click on your own link?
<beach>
Here (words is not aligned under (lines.
<q3cpma>
No, but that's just an upload website, it doesn't format properly
<beach>
Well, that's what we have to look at and it looks wrong to me.
<beach>
Wow, you should never have (safety 0)
<beach>
It makes things impossible to debug in case of a problem.
<q3cpma>
Yeah, but changing it doesn't do anything for this.
<q3cpma>
I just wanted to be sure debug data wasn't the culprit
Guest71 has joined #commonlisp
<beach>
You could try increasing the heap size to see whether that's the problem.
<etimmons>
I just finished the first release of my summer side-project on a pure CL library for reading and writing tar files: <https://common-lisp.net/project/cl-tar/>
<etimmons>
Hopefully others find it useful as well :)
<random-nick>
q3cpma: what's the purpose of the lines variable?
<q3cpma>
To gather the lines, so I can use :sharedp with cl-ppcre
<q3cpma>
Even if it doesn't work, I would expect at most twice the memory usage, to be honest
<yitzi>
etimmons: is the matrix bridge fixed here?
<q3cpma>
By the way, related question: can I trust the output of (room) concerning memory usage?
<etimmons>
yitzi: I'm getting messages from IRC again! I think the culprit was Alex . When they left the room I started getting things again.
<yitzi>
etimmons: Ok thanks.
<etimmons>
Would still love to prevent it from happening again, but it requires a mod to tweak a setting.
<yitzi>
Yeah, I just switched to matrix and it is pretty nice so kind of irritating to have a hickup.
MatrixTravelerbo has joined #commonlisp
<random-nick>
I'm guessing the shared structure ppcre refers to is array displacements, which shouldn't be making any weak references
<Gnuxie>
oops
<q3cpma>
random-nick: Sorry, you lost me. What are weak references?
<random-nick>
but yeah the lines list alone shouldn't be causing a heap exhaustion
<random-nick>
q3cpma: references which the garbage collector doesn't follow (i.e. something can still be garbage if there's a weak reference to it) and automatically invalidates when the referenced object is collected
<q3cpma>
I see, so what does a displaced array becomes when the parent is reaped (or is it reaped)?
<random-nick>
a displaced array should prevent its parent from being reaped
<random-nick>
as in, a "living" displaced array should keep its parent "living" or at least its storage
<q3cpma>
Cool, wonder if it's standard mandated
CodeBitCookie[m] has quit [Remote host closed the connection]
MatrixTravelerbo has quit [Read error: Connection reset by peer]
happy-dude has quit [Write error: Connection reset by peer]
JooTvora[m] has quit [Remote host closed the connection]
bitspook[m] has quit [Read error: Connection reset by peer]
hayley has quit [Read error: Connection reset by peer]
etimmons has quit [Read error: Connection reset by peer]
katco has quit [Remote host closed the connection]
loke[m] has quit [Remote host closed the connection]
saltrocklamp[m] has quit [Read error: Connection reset by peer]
IlluminatedPileo has quit [Write error: Broken pipe]
yitzi has quit [Remote host closed the connection]
bhyde[m] has quit [Write error: Connection reset by peer]
Gnuxie has quit [Write error: Connection reset by peer]
dieggsy has quit [Write error: Connection reset by peer]
Bi[m] has quit [Write error: Connection reset by peer]
alphapapa[m] has quit [Write error: Connection reset by peer]
Mrtn[m] has quit [Write error: Connection reset by peer]
rudi has quit [Read error: Connection reset by peer]
santiagopim[m] has quit [Remote host closed the connection]
luis` has quit [Remote host closed the connection]
dualinverter[m] has quit [Read error: Connection reset by peer]
Duuqnd[m]1 has quit [Remote host closed the connection]
akater[m] has quit [Read error: Connection reset by peer]
icepic1984[m] has quit [Remote host closed the connection]
scymtym_ has quit [Quit: ERC (IRC client for Emacs 28.0.50)]
loke[m] has joined #commonlisp
<q3cpma>
With a 4MB input file, I get 120MB of dynamic usage vs 40~45MB just for SBCL (using room)
katco has joined #commonlisp
luis` has joined #commonlisp
<q3cpma>
Something is definitely wrong
alphapapa[m] has joined #commonlisp
etimmons has joined #commonlisp
santiagopim[m] has joined #commonlisp
IlluminatedPileo has joined #commonlisp
rudi has joined #commonlisp
happy-dude has joined #commonlisp
Mrtn[m] has joined #commonlisp
scymtym has joined #commonlisp
dieggsy has joined #commonlisp
akater[m] has joined #commonlisp
icepic1984[m] has joined #commonlisp
saltrocklamp[m] has joined #commonlisp
hayley has joined #commonlisp
yitzi has joined #commonlisp
Gnuxie has joined #commonlisp
dualinverter[m] has joined #commonlisp
Everything has left #commonlisp [#commonlisp]
JooTvora[m] has joined #commonlisp
Bi[m] has joined #commonlisp
bitspook[m] has joined #commonlisp
Duuqnd has joined #commonlisp
MatrixTravelerbo has joined #commonlisp
CodeBitCookie[m] has joined #commonlisp
bhyde[m] has joined #commonlisp
hendursaga has quit [Ping timeout: 276 seconds]
hendursaga has joined #commonlisp
<q3cpma>
Here's the "final" version: http://0x0.st/-Y-G.lisp, NOT using sharedp allows me to process the 40MB file, but I still get 490MB of memory use (323M in 8.5M simple-character-string and 143MB in 9M cons).
Guest71 has quit [Quit: Client closed]
<q3cpma>
And there are 8M words in the input file, so the object count figures aren't absurd, only the mem use
<CodeBitCookie[m]>
Hello everyone
<CodeBitCookie[m]>
Any idea on shell scripting and writing short programs with sbcl?
<beach>
Hello CodeBitCookie[m].
<q3cpma>
CodeBitCookie[m]: personally, I'd just UIOP to interface with the OS
<mfiano>
Doesn't SBCL internally use utf32?
<q3cpma>
Hmmm, even then the 40MB file (containing ASCII) would still be 160MB, not 500
notzmv has quit [Ping timeout: 246 seconds]
<beach>
That might require using base-strings or somtething like that.
<beach>
something
terrorjack has quit [Read error: Connection reset by peer]
<scymtym>
for short strings, the overhead for array headers is also a factor
<mfiano>
sb-ext:primitive-object-size and the other memory introspection functions may be of help
<q3cpma>
Thanks, I used room
<beach>
I was just going to say what scymtym said.
terrorjack has joined #commonlisp
<q3cpma>
scymtym: what's fun is that room reports 55MB of array-headers IF I use sharep, but not otherwise
<scymtym>
q3cpma: you previously mentioned SIMPLE-CHARACTER-STRING. those have header data as well but probably not in the sense of that ROOM report
<q3cpma>
Breakthrough: enclosing the code in a dummy main functions completely solve the problem
igemnace has quit [Ping timeout: 264 seconds]
<q3cpma>
Man, I left Tcl where only procs are bytecoded to find CL where I get something similar. What a strange world.
<q3cpma>
....
<q3cpma>
Ignore me, I'm completely wrong
nature has joined #commonlisp
cosimone has quit [Ping timeout: 252 seconds]
<q3cpma>
So, playing with SB-EXT:PRIMITIVE-OBJECT-SIZE showed me that strings of size 0, 1-4, 5-8 weigh respectively 16, 32 and 48 bytes.
<q3cpma>
It's probably the cause of my misery
amb007 has quit [Ping timeout: 252 seconds]
amb007 has joined #commonlisp
<q3cpma>
So, is SBCL not suited at all for string processing, or am I supposed to do something?
<mfiano>
Try a simple-base-string
igemnace has joined #commonlisp
<q3cpma>
Thanks, it does seem to do something
<mfiano>
A base-string for example, is 32 bytes from 0-15 characters
<mfiano>
Not sure about simple-base-char strings
<q3cpma>
Hmmm, why does (the simple-base-string "abcd") not work but coerce does?
<mfiano>
Using type declarations is undefined behavior anyway. Infact, relying on the internal representation of the string types to stay consistent is bad. Just program Common Lisp instead of an implementation.
Nilby has joined #commonlisp
<q3cpma>
Well, I only get 2MB of saving with simple-base-string
karlosz has joined #commonlisp
<mfiano>
and that 2MB may change some next version of SBCL.
<mfiano>
I don't agree with implementation specific assumptions. We have a standard for a reason
<mfiano>
But that's just me
<q3cpma>
Guess so
<saturn2>
have you tried calling (sb-ext:gc :full t) before measuring memory use?
notzmv has joined #commonlisp
<mfiano>
Looks like you'll get a lot more savings with just base-string though
<q3cpma>
saturn2: it is a lot better, but the original problem was an OOM crash during processing
<q3cpma>
mfiano: why?
<mfiano>
SBCL's default heap size is incredibly small. Personally I set this to half of my physical ram, 32G. It won't all be allocated unless needed.
<mfiano>
No idea. I forget the details of the character types and which parts are UB
<q3cpma>
Maybe this isn't a Lispy way of thinking, but when I have to use 1G for no apparent reason, I'm a bit alarmed
<saturn2>
the default heap size is small, and also the default settings tend to let a lot of uncollected garbage build up
<mfiano>
A larger heap size will affect collections, yes
<Bike>
weird that it wouldn't run a collection rather than die from OOM, though. maybe something is actually kept alive? i don't see anything obvious...
Guest17 has joined #commonlisp
Guest17 is now known as jkordani
<mfiano>
Also is it an OS OOM or a heap exhaustion Lisp error
<saturn2>
using displaced strings as hash keys seems like a bit of an out of the ordinary thing to do, maybe there's a bug?
<q3cpma>
Heap exhaustion
<q3cpma>
OS OOM would be scary with only a 1G heap on a 64GB machine
<q3cpma>
saturn2: I switched to :sharedp nil, as it was causing a lot more memory usage (paradoxally)
<Nilby>
The reasons for sbcl's memory behavior are social rather than purely technical.
<saturn2>
yes i saw that
<q3cpma>
I understand that I can grow the heap, but I just wanted to know it needs that much
<q3cpma>
I replaced the argument of cl-ppcre to (coerce line 'simple-base-string)
<mfiano>
That's not a base-string
<q3cpma>
Hmmmm
<q3cpma>
How am I supposed to convert it, then?
<saturn2>
you can do (dotimes (n 7) (setf (sb-ext:generation-minimum-age-before-gc n) 0.1d0)) to make the garbage collector more aggressive
<mfiano>
Hmm, maybe Bike or someone knows how to read base characters from a stream
<q3cpma>
(sb-ext:primitive-object-size (coerce "abcdefghijklmno" 'simple-base-string)) does give me 32
<q3cpma>
saturn2: I'll try
<q3cpma>
Just for info, python does in 0.12s what the SBCL image with max speed declaim does in 3.94
<q3cpma>
mfiano: I can't convert it when reading, as I need NIL as sentinel value for EOF
<saturn2>
open the file with :element-type 'base-char ?
<q3cpma>
Sadly, I'm using stdin, but I'll try
<mfiano>
That isn't expected. That isn't very idiomatic code, and displaced arrays are slow
<mfiano>
Since they have to do bounds checking on both arrays, and implementations don't really optimize displaced arrays as much as they could
<q3cpma>
But these aren't displaced arrays
<mfiano>
Oh I thought I heard that above
<q3cpma>
It was (probably) when I was using :sharep t
<mfiano>
SBCL is often faster than C if coded right
<jeosol>
mfiano: good to know. That's with type hints and all?
<CodeBitCookie[m]>
Also I was thinking about McCLIM. I really love it. The big problem is that GUIs are made for people who can't use a terminal interface or it's just for an application like video editors which are better with a GUI. People today cannot stand to see something look even a tad bit outdated. I don't care about the looks but people who use my application will. Do you think McCLIM could be made pretty?
<q3cpma>
mfiano: That's what attracted me to CL
<jeosol>
I remember seeing a lisp paper that actually demonstrated it. I probably have it somewhere so it should be easily searchable on the web.
<jeosol>
Didier is the author, you can get more info
<saturn2>
sbcl should usually be faster than python even without type annotations
<q3cpma>
jeosol: already read it when I was in my hype phase
<jeosol>
q3cpma: ok, good
<jeosol>
haha, what do you mean by hype phase
<jeosol>
is the hype going down?
<CodeBitCookie[m]>
beach: Hey
<q3cpma>
jeosol: to be honest, a bit
<jeosol>
q3cpma: Interesting.
lisp123 has quit [Remote host closed the connection]
<q3cpma>
But I wrestled with uplevel too much in Tcl to abandon quasi-quoting and gensym
<jeosol>
I think it depends on your application and problem. For me, I came from matlab and c/c++ (grad school), then I came across CL in a thesis, and I switch because of how easy to read the code was. And emacs+slime+paredit for me is a good IDE.
<mfiano>
It takes a lot to write efficient code. Understanding the standard in depth is a must, and the nuances of the implementation you are writing implementation-specific optimizations for
<jeosol>
I really think it depends on what you are trying to solve and what is expected from it
<mfiano>
One can't expect to get good performance as a beginner
<jeosol>
mfiano: very true
<q3cpma>
I understand, but in this case, I don't really see an escape hatch.
<q3cpma>
Numerical and vector code obviously benefits from type hints
<jeosol>
once my application is extremely stable, then I plan to look into that, but I don't do any optimizations for now and things run really fast - and could be faster
<q3cpma>
jeosol: same, did C/Ocaml in school, C++ at work, found Tcl and now CL
<jdz>
I may be late, but was looking into SBCL's character reading from streams, and there's currently no way to read anything but strings with element type CHARACTER in SBCL. The only way is to COERCE after reading.
<jeosol>
q3cpma: Interesting
<q3cpma>
You can only appreciated such dynamic languages when you have tried horrible stuff with the C preprocessor
<mfiano>
You can do a lot at compile-time too, which is what cl-ppcre does, and why it is much faster than Perl, which has to interpret bytecodes
<jeosol>
q3cpma: I could not agree more, haha
<mfiano>
So maybe read in and convert your input to base-chars at compile time, etc
<q3cpma>
mfiano: Yes, but compiler-macros do seem like manual inlining to me
<mfiano>
or use load-time-value and other tricks
<mfiano>
umm, not compiler macros
<mfiano>
that is something else entirely
<q3cpma>
Isn't that what cl-ppcre does with scan?
<jeosol>
q3cpma: how long have been hacking CL?
<q3cpma>
1 week =)
<jeosol>
oh ok
<jeosol>
don't worry, I think you'll get things with time
<jeosol>
the guys here are extremely and you'd get multiple perspectives on your questions here
<jeosol>
..helpful
<q3cpma>
Will never get over the inconsistency of the stdlib/naming, but I know already enough to persevere
<q3cpma>
mfiano: I was thinking about aliases with fdefinition/symbol-function instead
aeth has joined #commonlisp
<q3cpma>
pjb: I'm trying to mentally process it
<q3cpma>
Looks like read doesn't handle punctation and other
<pjb>
q3cpma: the explaination is: READ parses "words" (symbols) and intern them in a case-insensitive way, in the current package (a temporary package). The hash table can be an EQL hash-table because the symbols are already interned. The rest is identical.
<pjb>
q3cpma: indeed, it assumes just words and spaces.
<pjb>
q3cpma: actually if the file contains special characters, READ will break because it'll try to parse lisp syntax (parentheses, numbers, etc).
<q3cpma>
Well, it doesn't seem to solve memory usage, to be honest, but that's a different and interesting solution
cosimone has joined #commonlisp
<saturn2>
using symbols really shouldn't be more efficient than strings
<pjb>
338 byte/word is too much?
<pve>
q3cpma: shouldn't you be building your histogram as you're reading each line?
<pjb>
saturn2: less garbage may be generated by interning the data when it's read.
<q3cpma>
pve: I could, but by doing step-by-step, I minimize function calls
<q3cpma>
But I'll try, the memory pressure may be slowing me down too
lisp123 has joined #commonlisp
<pjb>
q3cpma: of course, it could be made faster, but it'd really be micro-optimization. Only if you had to work with google-size data would you need that. Are you doing a hiring test to apply at google?
<pjb>
Otherwise, it's useless.
<q3cpma>
pjb: no, just trying to at least reach other languages
<scymtym>
q3cpma: is your input file available somewhere?
<saturn2>
pjb: "Just for info, python does in 0.12s what the SBCL image with max speed declaim does in 3.94"
<saturn2>
you wanna just let python get away with that?
<pjb>
q3cpma: there are no characters in C. Don't read strings. Read octets!
<pve>
q3cpma: not sure about the "minimize function calls", care to educate me?
<q3cpma>
and the same concatened 10 times
<q3cpma>
pve: Instead of doing a dolist per line, I do only one
<q3cpma>
Being progressive is a lot faster
<q3cpma>
Mistake, it was crashing
<Josh_2>
etimmons: Just seen your link for the tar project, very nice that will come in useful for me
<q3cpma>
etimmons: on that subject, since Tar has no real standard, what did you use as reference? GNU?
<q3cpma>
Or PAX, maybe?
<Josh_2>
also how did you get 40ants doc to work :( the examples wont run on my machine
<etimmons>
q3cpma: it can read ustar, pax, gnu, and v7 tar files. It can write each of them as well, but I'm missing a couple of gnu extensions in each direction.
<etimmons>
Josh_2: great! Sorry to hear about 40ants doc, what errors were you getting? I had some mgl-pax code that I just ported over so I didn't exactly follow the examples to the letter
<q3cpma>
etimmons: I was going to preempt you, found the gitlab
<q3cpma>
etimmons: GNU is the standard if you want sparse file and long names, these day, so nice
<Josh_2>
etimmons: the example on the github wont build. I run the (40ants-doc/builder:render-to-string @foo-random-manual :format :markdown) and get an error saying 'unable to figure out *package* for object :(
<etimmons>
q3cpma: PAX handles long names quite nicely as well. sparse files is one GNU extension I'm missing (in the high-level wrapper, at least). But it should be too difficult to add
<etimmons>
s/should/shouldn't/
<Josh_2>
But now I have seen your example site I am even more enthused by that doc builder
<q3cpma>
etimmons: yeah, I'm mixing things up, the problem I had were with the only pax utility (mirBSD pax), and not the format itself
<etimmons>
Josh_2: Huh, that's weird. I'll try to work through the example and see if I can see what's up
<Josh_2>
If you would that would be great :)
<yitzi>
q3cpma: Did you try sbcl with --no-userinit to do that benchmark? For me it takes it from ~4s to about ~.5s
jkordani has quit [Quit: Client closed]
<etimmons>
Josh_2: I was using mgl-pax for a while and really wish the 40ants stuff wasn't forked and was instead merged into mgl-pax.
<q3cpma>
yitzi: didn't change anything, I don't actualy have a ~/.sbclrc
<etimmons>
Josh_2: But I think there was some strong differences of opinion and I really like being able to load my documentation tool *without* also loading ironclad, so 40ants it is
<q3cpma>
yitzi: Also, when you say 4s, is it with the bible, or the bible cat'ed 10 times?
<yitzi>
Are you loading quicklisp?
<q3cpma>
Here, I get 3.6s for x10 and 0.6 for x1
<q3cpma>
Yes, I'll try a simple (require :cl-ppcre)
pranavats has left #commonlisp [Disconnected: Replaced by new connection]
Arcsech has joined #commonlisp
<yitzi>
It was just once with their simple.lisp ... in any case my point was that the startup code to load quicklisp/clpm can be significant.
pranavats has joined #commonlisp
<q3cpma>
Yes, I'm seeing it
<Josh_2>
etimmons: I have never used mgl-pax.. or any doc generating tool for that matter
<Josh_2>
ofcourse I am trying to change that
<q3cpma>
I don't actually know how to load cl-ppcre without QL =(
john__ has joined #commonlisp
Mandus has quit [Ping timeout: 264 seconds]
Mandus has joined #commonlisp
lisp123 has quit [Remote host closed the connection]
lisp123 has joined #commonlisp
Psybur has quit [Remote host closed the connection]
Psybur has joined #commonlisp
<q3cpma>
yitzi: I gained <0.1s by using (asdf:load-system "cl-ppcre"), is it the way to do it?
lisp123 has quit [Ping timeout: 252 seconds]
<Bike>
i think yitzi means the time advantage of not loading quicklisp at all. using ql:quickload isn't really going to be much slower if you already have it downloaded, since it just does asdf:load-system anyway
<q3cpma>
Oh, of course
<yitzi>
Correct. It might not make much of a difference since they are dumping an image and then executing that.
lisp123 has joined #commonlisp
lisp123 has quit [Remote host closed the connection]
<q3cpma>
I get 0.35 and 3.5s now
lisp123 has joined #commonlisp
<q3cpma>
Guess I'll stop now
<q3cpma>
Thanks for helping me again, I'll come back another time to at least try to bridge the gap with Slowthon =)
q3cpma has quit [Quit: leaving]
lisp123 has quit [Ping timeout: 252 seconds]
Lycurgus has quit [Quit: Exeunt]
cosimone has quit [Ping timeout: 265 seconds]
tyson2 has joined #commonlisp
lisp123 has joined #commonlisp
lisp123 has quit [Ping timeout: 260 seconds]
notzmv has quit [Remote host closed the connection]
copec has quit [Read error: Connection reset by peer]
copec has joined #commonlisp
akoana has joined #commonlisp
<etimmons>
Josh_2: I just tried the example. Only problem I ran into was I needed to add the package to the section name in the call to `render-to-string` (so `foo-random::@foo-random-manual`).
<etimmons>
I'm also using the latest version from git, so it's possible he fixed something
<Josh_2>
perhaps I should try the version straight from github
<Josh_2>
aah
<Josh_2>
there we go
<Josh_2>
ql:quickload ..doc-full worked
<etimmons>
ahhh, yeah. now I see that's less clear in the readme than I thought
<etimmons>
Your system should depend on 40ants-doc
<etimmons>
but when you go to generate the documentation, you need to load 40ants-doc-full
<Josh_2>
Thats what I was quickloading, I'd then realize I obviously need builder and ignored-words
<Josh_2>
so I'd pull those in, but no obvious mention of full
<Josh_2>
Now it is working I suppose I can actually make use of it
<Josh_2>
Thanks for doing that etimmons
Inline has joined #commonlisp
<etimmons>
Josh_2: Happy to help!
<jmercouris>
beach: for WSCL I think something should be said about PSETF
<jmercouris>
Josh_2 pointed it out, and macroexpanding it leads me to see that the documentation is very misleading
<jmercouris>
there is nothing parallel abou tit
<Bike>
you mean in that the value forms are evaluated in a specific order?
<_death>
it sets the bindings in parallel (rather than sequentially).. maybe you're conflating several meanings of the word
<Bike>
because i think that's pretty clear from the existing text
<Bike>
"More precisely, all subforms (in both the place and newvalue forms) that are to be evaluated are evaluated from left to right"
<_death>
compare (let ((a 4) (b 2)) (psetf a b b a) (list a b)) with s/psetf/setf
<jmercouris>
I still don't see how the bindings are set in parallel
<jmercouris>
looking at this macroexpansion I see two operations in series
<jmercouris>
first a let*, and then two setq forms
<jmercouris>
what part is in parallel?
<mfiano>
First you have to define what _you_ mean by "parallel".
<mfiano>
It seems not what the standard means
<jmercouris>
I mean occuring simultaneously
<_death>
a is set to the value of b, and b to the value of a "at the same time"
<jmercouris>
I don't think there is a disputable definition of parallel
<mfiano>
That is not the only definition, nor what the standard means.
<jmercouris>
but it is not "at the same time"
<jmercouris>
I don't know, seems wrong to me
<jmercouris>
if we contrive parallel to mean not parallel, then fine
<jmercouris>
it's valid
<mfiano>
parallel is not a temporal term
<_death>
it is.. before: a=4,b=2 and after b=4,a=2
<jmercouris>
fair enough, but we are usually discussing in the context of the fourth dimension
<Bike>
as far as the programmer is concerned, they can take place at the same time. there's no way to determine what order they take place in, if any.
<jmercouris>
it seems a fair assumption for the reader
<_death>
with setf, it would be: (i) set a to the value of b (a=2,b=2) (ii) set b to the value of a (a=2,b=2)
<Bike>
for example, if your macroexpansion happened to expand to the two setqs in a different order, or starting two threads that do the setq and then joining them, you'd never know
<jmercouris>
OK, I see now
<jmercouris>
I'm probably not the first, or last person to get confused by this
<mfiano>
Probably :)
<mfiano>
It is a nice tool and I reach for it a lot in my math codes
scymtym has quit [Ping timeout: 246 seconds]
nature has quit [Ping timeout: 265 seconds]
waleee has joined #commonlisp
Guest17 has joined #commonlisp
Guest17 is now known as jkordani
yewscion has joined #commonlisp
scymtym has joined #commonlisp
frgo has joined #commonlisp
molson__ has joined #commonlisp
molson_ has quit [Ping timeout: 246 seconds]
lottaquestions has joined #commonlisp
attila_lendvai has quit [Ping timeout: 252 seconds]
eddof13 has quit [Quit: My MacBook has gone to sleep. ZZZzzz…]
akoana has left #commonlisp [#commonlisp]
Qwnavery has joined #commonlisp
Qwnavery has quit [Client Quit]
shka has quit [Ping timeout: 252 seconds]
Lord_of_Life_ has joined #commonlisp
Lord_of_Life has quit [Ping timeout: 260 seconds]
Lord_of_Life_ is now known as Lord_of_Life
nature has joined #commonlisp
cosimone has quit [Ping timeout: 252 seconds]
Devon has joined #commonlisp
<Josh_2>
etimmons: are the docs generated by 40ants/doc able to be hosted by a webserver like nginx straight away?
lottaquestions has quit [Ping timeout: 260 seconds]
<etimmons>
Josh_2: yep! For instance, cl-tar publishes through Gitlab pages (which is just a static webserver under the hood)
<Josh_2>
Okay very cool
<etimmons>
Any time I tag a commit in cl-tar or cl-tar-file, it triggers a new pipeline in cl-tar-site which downloads the documentation for the tag, shoves it in the correct folder, and then does the magic Gitlab pages dance to tell it there's a new set of files ready to be served
lottaquestions has joined #commonlisp
<Josh_2>
cl-tar-site is a separate cl package right?
<etimmons>
It's also kind of an artifact of how c-l.net does its project pages. In order to get a site to show up under c-l.net/project/X/ using Gitlab pages, you need to use a repo named X/X-site
amb007 has quit [Ping timeout: 252 seconds]
amb007 has joined #commonlisp
<Josh_2>
Okay thanks
<Josh_2>
Guess I can get started on writing the docs for my primary project then
<etimmons>
Have fun and good luck :)
Josh_2 has quit [Ping timeout: 260 seconds]
jkordani has quit [Ping timeout: 256 seconds]
cage has quit [Quit: rcirc on GNU Emacs 27.1]
hayley has quit [Changing host]
hayley has joined #commonlisp
lottaquestions has quit [Ping timeout: 260 seconds]
john__ has quit [Ping timeout: 252 seconds]
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
nature has quit [Ping timeout: 252 seconds]
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
nature has joined #commonlisp
pve has quit [Quit: leaving]
doyougnu has quit [Ping timeout: 260 seconds]
frgo has quit [Remote host closed the connection]
frgo has joined #commonlisp
robin has quit [Read error: Connection reset by peer]
robin has joined #commonlisp
tyson2 has quit [Quit: ERC (IRC client for Emacs 27.2)]