jackdaniel changed the topic of #commonlisp to: Common Lisp, the #1=(programmable . #1#) programming language | Wiki: <https://www.cliki.net> | IRC Logs: <https://irclog.tymoon.eu/libera/%23commonlisp> | Cookbook: <https://lispcookbook.github.io/cl-cookbook> | Pastebin: <https://plaster.tymoon.eu/>
amb007 has quit [Ping timeout: 252 seconds]
kevingal has quit [Ping timeout: 244 seconds]
donleo has quit [Ping timeout: 245 seconds]
X-Scale has quit [Quit: Client closed]
X-Scale has joined #commonlisp
reb has quit [Remote host closed the connection]
reb has joined #commonlisp
amb007 has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
chomwitt has quit [Ping timeout: 252 seconds]
X-Scale has quit [Ping timeout: 256 seconds]
psilord has quit [Remote host closed the connection]
mgl_ has quit [Ping timeout: 252 seconds]
psilord has joined #commonlisp
LainExperiments has joined #commonlisp
Eoco has quit [Quit: WeeChat 4.4.2]
troojg has quit [Ping timeout: 260 seconds]
Eoco has joined #commonlisp
amb007 has quit [Ping timeout: 260 seconds]
arpunk_ is now known as arpunk
edgar-rft_ has joined #commonlisp
edgar-rft` has quit [Ping timeout: 252 seconds]
X-Scale has joined #commonlisp
troojg has joined #commonlisp
amb007 has joined #commonlisp
random-nick has quit [Ping timeout: 272 seconds]
amb007 has quit [Ping timeout: 252 seconds]
remexre has quit [Remote host closed the connection]
LainExperiments has quit [Ping timeout: 256 seconds]
troojg has quit [Ping timeout: 252 seconds]
triffid has quit [Remote host closed the connection]
triffid has joined #commonlisp
Pixel_Outlaw has joined #commonlisp
brokkoli_origin has quit [Ping timeout: 276 seconds]
brokkoli_origin has joined #commonlisp
brokkoli_origin has quit [Remote host closed the connection]
brokkoli_origin has joined #commonlisp
akoana has quit [Quit: leaving]
notzmv has joined #commonlisp
amb007 has joined #commonlisp
amb007 has quit [Ping timeout: 252 seconds]
Pixel_Outlaw has quit [Quit: Leaving]
istewart has quit [Quit: Konversation terminated!]
jon_atack has joined #commonlisp
remexre has joined #commonlisp
remexre has quit [Remote host closed the connection]
robin has quit [Read error: Connection reset by peer]
jonatack has quit [Ping timeout: 255 seconds]
robin has joined #commonlisp
decweb has quit [Ping timeout: 245 seconds]
remexre has joined #commonlisp
wacki has joined #commonlisp
shka has joined #commonlisp
chomwitt has joined #commonlisp
amb007 has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
pve has joined #commonlisp
crumbles has quit [Quit: ZNC - https://znc.in]
crumbles has joined #commonlisp
wacki has quit [Quit: My Mac has gone to sleep. ZZZzzz…]
Th30n has joined #commonlisp
treflip has joined #commonlisp
wacki has joined #commonlisp
King_julian has joined #commonlisp
mishoo has joined #commonlisp
Lord_of_Life has quit [Ping timeout: 252 seconds]
chkhd has joined #commonlisp
Lord_of_Life has joined #commonlisp
aadcg has joined #commonlisp
<aadcg> is there a way to skip nil arguments when iterating using format? e.g. (format nil "~@{~A~^,~}" 1 nil) => 1
bendersteed has joined #commonlisp
varjag has joined #commonlisp
<aeth> yes
<aadcg> aeth: could you provide an example?
<ixelp> CLHS: Section 22.3.7.2
<aeth> it's, uh, a bit confusing
<aeth> for one thing, it's kind of backwards, so the false part comes first
<aadcg> thanks for the pointer!
<aeth> for another, it consumes the argument
<aeth> so (format t "~:[~;~A~]" 1 2) (don't print first then print ~A) prints 2 even though 1 is true.
<aeth> but iirc there's a way to go back
<aeth> ah, yes, the previous entry
<ixelp> CLHS: Section 22.3.7.1
<aeth> ,(format t "~:[~;~:*~A~]" 1 2)
<ixelp> 1 => NIL
<aeth> But once you get that, it nests into what you had. ,(format t "~@{~:[~;~:*~A ~]~}" nil 1 nil 2 nil 3)
<ixelp> (format t "~@{~:[~;~:*~A ~]~}" nil 1 nil 2 nil 3) 1 2 3 => NIL
<aadcg> I need some time for it to sink in, so I'll dive deeper into these sections. thanks again!
<aeth> you're welcome.
<aadcg> it's interesting that aeth and ixelp had their thinking so synchronized
<aeth> ,(progn "yes")
<ixelp> (progn "yes") => "yes"
<aadcg> ah, I'm a noob. it's an IRC thing. it's the same person lol
<aeth> it's a bot that handles expressions, but it... kinda didn't do FORMAT T well
<aeth> in hindsight I would've done FORMAT NIL if I knew that in advance
<aadcg> ,(print "hello world!")
<ixelp> ↩ "hello world!" => "hello world!"
<aeth> this channel strips colors, which doesn't help
<aeth> bots usually use colors here, and iirc ixelp does
<aeth> but also printing is less clear to express than something that doesn't have a side effect and just has a return value
attila_lendvai_ has joined #commonlisp
brokkoli_origin has quit [Quit: (Leaving)]
brokkoli_origin has joined #commonlisp
<aadcg> aeth: I now understand format's conditional expressions but my problem changed
<aadcg> ,(format nil "~@[x: ~a~],~@[y: ~a~],~@[z: ~a~],~@[t: ~a~]" 1 2 nil 4)
<ixelp> => "x: 1,y: 2,,t: 4"
<aadcg> how can I fix the commas when some of the arguments are NIL? if I was iterating (via ~{) I could use "~^," but that's not the case. any idea?
<aeth> yes, put the commas with the ~a
<aeth> in the conditional
notzmv has quit [Ping timeout: 252 seconds]
<aadcg> oh, of course
pkal has quit [Read error: Connection reset by peer]
pkal has joined #commonlisp
GalaxyNova has quit [Ping timeout: 252 seconds]
dino_tutter has joined #commonlisp
treflip has quit [Remote host closed the connection]
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
donleo has joined #commonlisp
alcor has joined #commonlisp
mountainman1312 has quit [Remote host closed the connection]
X-Scale has quit [Quit: Client closed]
mountainman1312 has joined #commonlisp
<aadcg> ,(format nil "~@[x: ~a, ~]~@[y: ~a, ~]~@[z: ~a, ~]~@[t: ~a~]" 1 2 3 nil)
<ixelp> => "x: 1, y: 2, z: 3, "
<aadcg> aeth: but there's still this case to handle
<aadcg> of course I can post process it after format, but I'm wondering if there's functionality that I am missing within format
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
mgl_ has joined #commonlisp
amb007 has quit [Ping timeout: 276 seconds]
amb007 has joined #commonlisp
simendsjo has joined #commonlisp
Equill has joined #commonlisp
chomwitt has quit [Ping timeout: 260 seconds]
jdz_ is now known as jdz
Equill has quit [Client Quit]
<aadcg> the best solution I could come up with, https://paste.debian.net/1334507/
Akbar-Birbal has left #commonlisp [Disconnected: Replaced by new connection]
Akbar-Birbal has joined #commonlisp
<jdz> Not sure what the exercise is, but sometimes not it's OK to not use FORMAT. https://plaster.tymoon.eu/view/4641#4641
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
donleo has quit [Ping timeout: 244 seconds]
Odin-LAP has joined #commonlisp
simendsjo has quit [Remote host closed the connection]
notzmv has joined #commonlisp
benjaminl has quit [Read error: Connection reset by peer]
benjaminl has joined #commonlisp
chkhd has quit [Quit: ZZZzzz…]
chkhd has joined #commonlisp
Akbar-Birbal has left #commonlisp [#commonlisp]
Akbar-Birbal has joined #commonlisp
<aadcg> jdz: that's an OK solution too. I was wondering if there's a way to solve it with a single format directive. the goal is code golf.
simendsjo has joined #commonlisp
simendsjo has quit [Client Quit]
simendsjo has joined #commonlisp
chkhd_ has joined #commonlisp
chkhd has quit [Ping timeout: 252 seconds]
mwnaylor has quit [Ping timeout: 276 seconds]
decweb has joined #commonlisp
chkhd_ is now known as chkhd`
chkhd` has quit [Quit: ZZZzzz…]
chkhd has joined #commonlisp
anticomputer has quit [Ping timeout: 260 seconds]
King_julian has quit [Read error: Connection reset by peer]
chkhd has quit [Ping timeout: 276 seconds]
King_julian has joined #commonlisp
triffid has quit [*.net *.split]
chiselfuse has quit [*.net *.split]
anticomputer has joined #commonlisp
chiselfuse has joined #commonlisp
triffid has joined #commonlisp
chkhd has joined #commonlisp
jonatack has joined #commonlisp
jon_atack has quit [Ping timeout: 260 seconds]
X-Scale has joined #commonlisp
Everything has joined #commonlisp
X-Scale has quit [Ping timeout: 256 seconds]
<ixelp> TurtleWare
random-nick has joined #commonlisp
King_julian has quit [Read error: Connection reset by peer]
Odin-LAP has quit [Quit: What's this button do?]
jackdani1l is now known as jackdaniel
jackdaniel has quit [Changing host]
jackdaniel has joined #commonlisp
chkhd has quit [Quit: ZZZzzz…]
pranav has quit [Read error: Connection reset by peer]
dnhester26 has joined #commonlisp
chkhd has joined #commonlisp
<dnhester26> is it a bad idea to make this pretty-gensym https://plaster.tymoon.eu/view/4643#4643 ? I was looking for something like that and was surprised it doesn't exist
<dnhester26> I don't want the symbols generated to have a number if they don't have to for aesthetic reasons...
<dnhester26> *was surprised I couldn't find one I should say
<jackdaniel> it, because someone may use that symbol /after/ you've created your gensym
<jackdaniel> so you may have collissions in the future
<jackdaniel> also, your symbol has a home package, so it will be never garbage collected
<jackdaniel> (the latter is important, because you could have answered that to avoid collisions you'll create a private package for your gensyms)
<jackdaniel> s/private/dedicated/
pranav has joined #commonlisp
<dnhester26> but it's less likely that someone would use a symbol that has a number? or is there some kind of guarantee against that?
<dnhester26> ah, meaning that for symbols that only live during the lifetime of a macro execution they are garbage collected? yeah, in this case I want the symbol to be there forever
<dnhester26> thanks for answering
Everything has quit [Quit: leaving]
<beach> Maybe I am not understanding it, but I see no possibility for collisions.
Versality has joined #commonlisp
chomwitt has joined #commonlisp
<beach> That is, I don't see how the symbol you generate could be inadvertently used.
<jackdaniel> my bad, I've mixed make-symbol with intern
<jackdaniel> but theb, why tesf if it exists?
<jackdaniel> then, test *
<dnhester26> well if it exists then I use gensym, if it doesn't I use it as is. I assume the user is doing it in his package, I don't want to cause trouble there
<beach> dnhester26: But you don't use it as is, do you?
<dnhester26> but he will use those symbols on his own, so I don't think he will create other things that need that name
<beach> dnhester26: You create a new symbol either way.
<dnhester26> beach: the symbol am getting from the pretty-gensym? I use it inside the macro, what do you mean you don't use it?
<dnhester26> ah yeah, if it exists so then I get another one
<beach> dnhester26: You said "I use it as is".
<beach> dnhester26: But you don't, do you?
younder has quit [Remote host closed the connection]
Versality has quit [Remote host closed the connection]
<dnhester26> I just need a symbol, but I would rather generate one without a number in case it's available so that it looks nicer to the user (in this case me) when I use those symbols later on, but I use whatever output comes from pretty-gensym. I don't follow what you mean by "as is". Do you mean without the procedure checking if it exists first and do gensym?
<beach> dnhester26: Why not just use MAKE-SYMBOL as is?
<dnhester26> I am using the output of pretty-gensym, so I use whatever is available
<dnhester26> maybe the symbol is taken? wouldn't that cause an issue with make-symbol?
<beach> The symbol can not be taken, because MAKE-SYMBOL always creates a new symbol.
<dnhester26> one sec. if I did (defun foo) and later I do (make-symbol "foo") what happens?
<beach> MAKE-SYMBOL always creates a new symbol,.
<dnhester26> ah, is it not stored int he current package?
<beach> ,(eq (make-symbol "foo") (make-symbol "foo"))
<ixelp> => NIL
<beach> MAKE-SYMBOL always creates a new, uninterned symbol.
<dnhester26> *in the
<dnhester26> ah, I want the symbols to be available in the package, so does it make sense now to use gensym or still use make-symbol?
Versality has joined #commonlisp
<beach> You would absolutely not want the symbol to have a home package, as jackdaniel pointed out.
<beach> For that you would use INTERN, but that is absolutely not recommended. If all you want is a pretty name, use MAKE-SYMBOL.
<dnhester26> If I'm in the REPL and use make-symbol and don't save it in a variable, and later on want to use the function associated with that symbol, how would that work?
zetef has joined #commonlisp
zetef has quit [Client Quit]
<beach> dnhester26: It won't. MAKE-SYMBOL and GENSYM are precisely for the cases where you do not want the symbol to be possible to be created by the reader later on.
<beach> dnhester26: For example, you may have nested macro calls, and then you don't want the same symbol to be used.
<beach> dnhester26: If you want to reuse the symbol, use INTERN, but then don't use it for things like you would use GENSYM or MAKE-SYMBOL for.
<dnhester26> here I am generating a class with a macro and want that name of the class in the repl to be available later on for using to make instances etc in an interactive way
<beach> dnhester26: The good way of doing that is to have the user pass a symbol to use as the name.
<dnhester26> what should I do in the macro then? I need a symbol name that is available, I thought that's what gensym was for
<beach> GENSYM is specifically for when you absolutely do not want the symbol to be created by the reader later on.
<dnhester26> right but am generating a ton of things, so I just want to remove friction and make it so they can just call the macro and get a print out of the available things that were created
<dnhester26> what should I use in this case?
<beach> I don't know. The use case seems strange, and I don't fully understand it. I was just telling you what the mechanisms are.
<dnhester26> ok, thanks
Versality has quit [Remote host closed the connection]
<beach> By the way, why do you need for it to be a macro?
amb007 has quit [Ping timeout: 252 seconds]
amb007 has joined #commonlisp
younder has joined #commonlisp
<dnhester26> when I was doing things with the defclass, the defclass would give me errors saying that the expressions were invalida because they were not being evaluated, they were being taken as a string instead of an expression,
Versality has joined #commonlisp
chomwitt has quit [Ping timeout: 276 seconds]
wacki has quit [Read error: Connection reset by peer]
prokhor has quit [Remote host closed the connection]
KaitoDaumoto has joined #commonlisp
notzmv has quit [Remote host closed the connection]
aadcg has quit [Ping timeout: 264 seconds]
notzmv has joined #commonlisp
chkhd has quit [Quit: ZZZzzz…]
wacki has joined #commonlisp
chomwitt has joined #commonlisp
chkhd has joined #commonlisp
LainExperiments has joined #commonlisp
amb007 has quit [Remote host closed the connection]
varjag has quit [Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.3)]
cmack has joined #commonlisp
<phoe> dnhester26: give an example perhaps?
<dnhester26> phoe: example of why I need a macro or the usage I'm doing now? I changed the code so the non macro version is hard to get. Basically it wouldn't evaluate an expression to get a class name. The code works, I was just wondering if there is a problem with what I was doing
<dnhester26> thanks for the help though
Th30n has quit [Ping timeout: 272 seconds]
<phoe> "taking things as a string" sounds like something going horribly wrong
<phoe> ...in context of defining new classes, that is
simendsjo has quit [Ping timeout: 255 seconds]
<beach> It does.
<dnhester26> yeah, ok, I'll post the output from the REPL so you can see what I mean
<dnhester26> as you can see I just wanted a list of superclassses to inherit from
<beach> There is not a single string in there.
<dnhester26> But for some reason I would get this error which was not evaluating the expression to give the name of the class
<dnhester26> it works now, so it's ok
<dnhester26> thanks though
NotThatRPG has quit [Remote host closed the connection]
<phoe> oh, some parts were not being evaluated
<phoe> yes, I see
rogersm has joined #commonlisp
<dnhester26> that'w when I was doing it inside the function, and the error would say that cons is not a valid type
<dnhester26> turning it into a macro, with backquote and then comma before the form fixed the issue
<dnhester26> backquote before the defclass
<dnhester26> so that the form would be evaluated before it's passed to defclass as an argument
<beach> But there is also a functional interface to the class system.
<beach> ::mop ensure-class
<ixelp> ensure-class
prokhor has joined #commonlisp
wacki has quit [Ping timeout: 260 seconds]
simendsjo has joined #commonlisp
kevingal has joined #commonlisp
wacki has joined #commonlisp
chkhd is now known as chkhd`
wacki has quit [Read error: Connection reset by peer]
wacki has joined #commonlisp
<dnhester26> ah, thanks for that. That was exactly what I needed. I actually looked for a function by doing M-. into the defclass, but the code was too complicated so I just gave up. Next time I'll know I can actually use a function to define a class
<phoe> yes, the implementation internals for that are going to be messy
<phoe> mop:ensure-class is a stable interface, and more or less every impl supports using the MOP
lucasta has joined #commonlisp
chkhd has joined #commonlisp
bendersteed has quit [Quit: bendersteed]
Versality has quit [Remote host closed the connection]
wacki has quit [Ping timeout: 246 seconds]
Versality has joined #commonlisp
NotThatRPG has joined #commonlisp
NotThatRPG has quit [Remote host closed the connection]
wacki has joined #commonlisp
zwr has quit [Read error: Connection reset by peer]
NotThatRPG has joined #commonlisp
eddof13 has joined #commonlisp
zwr has joined #commonlisp
X-Scale has joined #commonlisp
eddof13 has quit [Ping timeout: 255 seconds]
donleo has joined #commonlisp
alcor has quit [Ping timeout: 252 seconds]
alcor has joined #commonlisp
dnhester26 has quit [Remote host closed the connection]
kevingal has quit [Ping timeout: 260 seconds]
rogersm has quit [Quit: Leaving...]
chomwitt has quit [Ping timeout: 252 seconds]
chkhd` is now known as chkhd
chkhd has quit [Quit: ZZZzzz…]
chkhd has joined #commonlisp
dnhester26 has joined #commonlisp
zxcvz has joined #commonlisp
zxcvz has quit [Client Quit]
chkhd has quit [Ping timeout: 260 seconds]
wacki has quit [Quit: My Mac has gone to sleep. ZZZzzz…]
amb007 has joined #commonlisp
dnhester26 has quit [Remote host closed the connection]
dnhester26 has joined #commonlisp
LainExperiments has quit [Quit: Client closed]
dnhester26 has quit [Client Quit]
Akbar-Birbal has left #commonlisp [#commonlisp]
GalaxyNova has joined #commonlisp
alendvai__ has joined #commonlisp
attila_lendvai_ has quit [Ping timeout: 244 seconds]
treflip has joined #commonlisp
LainExperiments has joined #commonlisp
wacki has joined #commonlisp
cage has joined #commonlisp
cage has quit [Excess Flood]
cage has joined #commonlisp
chomwitt has joined #commonlisp
brokkoli_origin has quit [Ping timeout: 252 seconds]
lucasta has quit [Quit: Leaving]
rcs has joined #commonlisp
rcs has quit [Client Quit]
mgl_ has quit [Ping timeout: 246 seconds]
chomwitt has quit [Ping timeout: 260 seconds]
treflip has quit [Read error: Connection reset by peer]
mgl_ has joined #commonlisp
brokkoli_origin has joined #commonlisp
Pixel_Outlaw has joined #commonlisp
chkhd has joined #commonlisp
dajole has joined #commonlisp
chkhd has quit [Ping timeout: 252 seconds]
zetef has joined #commonlisp
zetef has quit [Client Quit]
simendsjo has quit [Ping timeout: 276 seconds]
X-Scale has quit [Ping timeout: 256 seconds]
brokkoli_origin has quit [Ping timeout: 265 seconds]
dnhester26 has joined #commonlisp
LainExperiments has quit [Quit: Client closed]
LainExperiments has joined #commonlisp
brokkoli_origin has joined #commonlisp
Alfr has quit [Quit: Leaving]
<dnhester26> Bubblegumdrop: I put a few extensions of mito together so that they work with each other, namely mito-auth, mito-validate, and mito-auth-jzon (to avoid encoding sensitive slots): https://github.com/daninus14/mito-extended
<ixelp> GitHub - daninus14/mito-extended
brokkoli_origin has quit [Remote host closed the connection]
amb007 has quit [Ping timeout: 264 seconds]
brokkoli_origin has joined #commonlisp
amb007 has joined #commonlisp
Alfr has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
X-Scale has joined #commonlisp
NotThatRPG has quit [Quit: Textual IRC Client: www.textualapp.com]
NotThatRPG has joined #commonlisp
X-Scale has quit [Quit: Ping timeout (120 seconds)]
mishoo has quit [Ping timeout: 264 seconds]
zxcvz has joined #commonlisp
zxcvz has quit [Client Quit]
chomwitt has joined #commonlisp
kevingal has joined #commonlisp
LainExperiments6 has joined #commonlisp
cage has quit [Quit: rcirc on GNU Emacs 29.4]
chkhd has joined #commonlisp
phae9 has joined #commonlisp
kevingal has quit [Remote host closed the connection]
kevingal has joined #commonlisp
LainExperiments has quit [Ping timeout: 256 seconds]
chkhd has quit [Ping timeout: 265 seconds]
LainExperiments6 has quit [Ping timeout: 256 seconds]
kevingal has quit [Ping timeout: 265 seconds]
pve has quit [Quit: leaving]
amb007 has quit [Ping timeout: 265 seconds]
mwnaylor has joined #commonlisp
amb007 has joined #commonlisp
amb007 has quit [Read error: Connection reset by peer]
amb007 has joined #commonlisp
LainExperiments has joined #commonlisp
alendvai__ has quit [Ping timeout: 272 seconds]
LainExperiments has quit [Quit: Client closed]
alcor has quit [Remote host closed the connection]
<phoe> woohoo
<phoe> just came home after holding a lecture with a fair amount of lisp in it
<phoe> (including a tiny live demo of the live capabilities with slime + conditions)
tucktuck has quit [Remote host closed the connection]
mwnaylor has quit [Ping timeout: 248 seconds]
Everything has joined #commonlisp
<phae9> cool!
rtypo has joined #commonlisp
mgl_ has quit [Ping timeout: 252 seconds]
<kpg> Nice one (-: at least in CL such live stuff is doable without having to tear down whole namespaces as in Clojure. Where was it?
<kpg> I once did that for work (small condition system discussion), turned out one guy who showed up was an old school syscog lisp hacker in the late 90s. That was a nice chat. And they are still using lisp iirc.
<phoe> kpg: my home university and faculty
<phoe> WMiI UJ, Kraków
<kpg> oh, greetings from Poznań, then - pozdro, even
<phoe> wow, what are you doing there? :D
tucktuck has joined #commonlisp
<kpg> Born and raised - still can't get convinced to leave this place
<aeth> such a strange coincidence that the Polish notation language has so many Polish users
<phoe> nice
<kpg> as for work as programmer, your local options are: allegro... yup that's it
wacki has quit [Quit: My Mac has gone to sleep. ZZZzzz…]
Everything has quit [Quit: leaving]
<phoe> not nice
NotThatRPG has quit [Ping timeout: 245 seconds]
kevingal has joined #commonlisp
shka has quit [Quit: Konversation terminated!]
rcoper has joined #commonlisp
dnhester26 has quit []
lucasta has joined #commonlisp
dino_tutter has quit [Ping timeout: 265 seconds]
ocra8 has joined #commonlisp
chomwitt has quit [Ping timeout: 244 seconds]
chkhd has joined #commonlisp
NotThatRPG has joined #commonlisp
chkhd has quit [Ping timeout: 272 seconds]
tucktuck has quit [Remote host closed the connection]
Versality has quit [Remote host closed the connection]
donleo has quit [Ping timeout: 244 seconds]