freenode/#clasp - IRC Chatlog
Search
4:38:48
beach
Bike: I see a potential paper submission for ELS, entitled "MAKE-METHOD-LAMBDA revisited" or something like that.
4:40:03
beach
It is not hard to store the name of the GENERIC-FUNCTION-CLASS and the METHOD-CLASS from the DEFGENERIC form in the compile-time environment, and to have DEFMETHOD look that up.
4:41:11
beach
DEFMETHOD would simply get the CLASS-PROTOTYPE of those two and pass them to MAKE-METHOD-LAMBDA. Problem solved.
4:42:19
dvssa
drmeister: testing branch doesnt load :cando-user it gives https://gist.github.com/DurhamSmith/8a34bb52c297e9c4c084f89257caa559 I think I'll be able to get it working myself im just going to grab something to eat first.
4:42:32
beach
Bike: And I will likely write a joint paper with Didier, showing that we can solve his issues with method combinations in a way that is consistent with both the MOP and the Common Lisp HyperSpec.
4:43:57
beach
And it does not use the ugly solution where the generic function is the data base for method combinations. It stores them in a SICL first-class global environment.
4:44:01
drmeister
dvssa: Ok - sorry about that. This is what the CI system should help us resolve. We have a chain of dev -> testing -> preview -> master branches. The CI system will only promote builds up the chain if they work.
4:45:44
drmeister
I'm looking forward to getting this CI system up and running - it's going to take a huge load off my mind.
5:03:22
beach
In SBCL, I did the following: after start-up I typed (gc :full t) then (room). Then I loaded sicl-boot, typed (gc :full t) and (room) again.
5:04:05
beach
That is so small that I am now considering including the compiler in the initial image.
5:04:40
beach
I mean, it needs more, say twice as much that Cleavir uses, but that's still very modest.
5:08:35
beach
Yes, I see. It will probably take up more room in Clasp I would guess. Especially if it compiled itself.
5:10:22
beach
Speaking of which, now that I do the right thing in SICL and have compute-effective method return a form instead of a function, it will be much easier to optimize cases where an effective method contains a single accessor method.
5:11:38
Bike
because you can just look at the effective method to determine whether the optimization is appropriate?
5:12:25
beach
I can do that. But in the simple case, I can just create a form that uses standard-instance-access directly and compile it instead of what the method combination produces.
5:14:26
Bike
which is, have a generic function that controls the macroexpansion of call-method forms
5:14:49
Bike
that is, the generic function is passed the arguments of call-method. since the first argument of call-method is usually a literal method, it can be dispatched on
5:15:40
Bike
then you can, e.g, have fastgf bind an *actual-specializers* variable or something, and then you can have a method on standard-reader-method that expands the call-method into a standard-instance-access.
5:17:18
Bike
the reason i was wondering about it is that costanza mentions the problem of how to define that a method (function) takes arguments other than the default arguments+next-methods, which i think is genuinely underspecified by mop
5:18:16
beach
Yes, and that is a requirement for accessors. Imagine a generic function with a single method on it....
5:18:36
beach
... building a list of arguments and then calling an effective method that calls a method function is way too slow.
5:19:35
beach
Sure, the slot can be in different locations depending on the (sub-)class of the argument, but that should already be in the discriminating function.
5:22:12
beach
This case will be extremely common in SICL, given that functions like SYMBOL-NAME and PACKAGE-NICKNAMES will be generic.
5:22:22
Bike
it's more like (cond ((= stamp 10) (standard-instance-access instance 5)) ((= stamp 30) (standard-instance-access instance 6)))
5:24:57
Bike
even in the worst case, it still might be nice. like, if you have an :after method on a slot reader, (progn (standard-instance-access ...) (funcall method-function ...)) might still be noticeably better than two funcalls
5:26:52
beach
OK, if I run the entire NEW BOOT procedure as it is now, creating 4 first-class global environments with several different versions of the same code, and the entire thing seems to take 100MB or so in SBCL. That gives me a factor 100 margin to play with. :)
5:31:03
beach
If I can include the compiler in the initial image, I can remove tons of code that tries to avoid using the compiler.
5:55:43
beach
Within the body forms, the generic-function-symbol is bound to the generic-function-object.
5:57:36
Bike
anyway, the real problem isn't the generic function argument. it's the method argument.
5:58:43
Bike
you can have the same method (method function) called with different sets of next-methods. the method-function accepts as arguments a list of arguments and a list of next methods.
6:01:44
Bike
i mean, so the method function doesn't know the particulars of how it's called at compile time. it works off the list of next methods it receives, which is a regular argument.
6:02:46
beach
Indeed. It is only when the method is produced with make-method that it is. Oh well. More thinking to do.
6:03:27
Bike
of course the generic function is still not really a problem since it's obvious what generic function it is when defmethod is expanded etc.
6:05:02
beach
Also, when the defmethod is expanded, you don't necessarily have the generic-function metaobject.
6:06:43
Bike
that's for the method though. the problem being that defmethod expands into something involving (make-instance ... :method-function (lambda ...)) but the lambda needs to know about the method being make-instance'd.
6:09:36
Bike
yeah. like (let (method) (setf method (make-instance ... :method-function (lambda ... method ...))))
6:10:43
Bike
that means make-method-lambda has to return something that only works in certain environments, though
6:13:39
Bike
no-next-method is rare enough that it might not be completely ridiculous to have call-next-method find-method itself
6:13:41
beach
So if each method-function has access to the method metaobject, the problem is solved.
6:31:35
beach
minion: memo for Bike: MAKE-METHOD-LAMBDA takes an environment object. We could augment the compile time environment with a binding holding the name of a variable that call-next-method can refer to to for the method object. The expansion of DEFMETHOD can then bind that variable.
10:14:34
frgo
Hello all. Interesting MOP stuff you guys were discussing here during last two days ...
10:28:49
beach
"MAKE-METHOD-LAMBDA revisited", "SICL method combinations", and maybe "Bootstrapping Common Lisp".
10:31:51
beach
Actually, it is quite impressive how much stuff there is in the literature and in existing implementations that has not been thought upon for decades.
10:33:05
beach
All those things influence how software is written, so it often suffices to take a close look to see how things can be improved.
10:36:42
beach
And there is some bad science out there. I hear that the vast majority of CS books don't get a thing as simple as binary search right. And most of those that get it right have solutions with way too many more operations than necessary.
10:52:07
makomo
beach: agreed with frgo. i like the formal style of your documentation very much and i think we need more of such stuff.
10:52:49
makomo
basically the "mathy" style of it -- the various explicit definitions and introduction of terminology, etc.
10:54:00
makomo
beach: if i had to choose, i would probably pick the last paper since bootstrapping is always a cool subject. then again, i don't yet understand the problems of the first two, so i can't really judge it that well :-)
12:07:32
beach
makomo: One of the thing I have learned over the years, is that it is much easier to understand what the objects do if you give them a nam. Hence the many definitions in what I write.
12:09:35
makomo
beach: i've come to the same conclusion myself and 100% agree with it. i always like to use math as an example where that practice is extremely important
12:10:00
makomo
and of course, lisp, where we can, along with functional abstractions, also give source code patterns a proper name through macros
12:25:38
beach
heisig: Did you read my suggestion to Bike for making it possible for the method function to refer to the method?
12:41:21
beach
When DEFMETHOD is expanded, it augments the environment that make-method-lambda uses.
12:42:04
beach
That environment contains a symbol (gensymed) that it then uses to bind the value of the make-instance call.
12:52:32
beach
Different subject: suppose I wanted to use host FASLs to speed up SICL bootstrapping. Currently, when I load a source file into some SICL first-class global environments, I compile it a huge host function with one parameter, the environment to "tie" it to. Tying is done by executing that huge function on the environment of choice.
12:52:33
beach
What if I instead compiled it to (funcall <that-huge-function> *environment*) where *environment is some SICL special variable? I could then use the host file compiler to produce a host FASL that I can load later on.
12:53:09
beach
Then I would just say (let ((*environment* <environment-of-choice>)) (load <fasl-file>))
12:55:09
beach
It might get complicated though, because the macros used by a particular source file could have different definitions in different environments.
12:57:42
heisig
What would be the difference between the former ant the latter approach? In both cases, the host compiler has to compile <that-huge-function>. To me, it seems both approaches are just different conventions of how to pass an environment to the huge function.
12:58:34
beach
When I modify a single thing and run the procedure again, I could avoid the compilation step in most cases.
12:59:54
beach
What I have currently for the new bootstrapping procedure takes 3 minutes on my machine, and it is going to take longer as I add more processing.
13:02:35
heisig
Ah ok, so in the current scheme you cannot exchange the environment without rebuilding the FASL. Then the *environment* approach sounds like a good idea. As long as the macro definitions do not change, everything should be fine.
13:03:35
beach
Yeah, I would have to keep the FASLs distinct for each environment. It might not be worth it.
13:03:56
beach
But 3 minutes is enough to lose concentration and not enough to go do something else. :)
13:06:29
beach
I could also work on making the code smaller for the SBCL compiler to compile of course.
13:07:17
heisig
Random idea: You could use the SXHASH of the source forms of all macro definitions in an environment to decide whether an environment is compatible with a FASL.
13:23:08
Bike
the dynamic variable thing is basically what i did when i was experimenting with sandboxing. it seemed to go okay.
13:23:09
minion
Bike, memo from beach: MAKE-METHOD-LAMBDA takes an environment object. We could augment the compile time environment with a binding holding the name of a variable that call-next-method can refer to to for the method object. The expansion of DEFMETHOD can then bind that variable.
13:33:15
beach
Sometimes I think I should create a #sicl channel to avoid filling #clasp with this stuff. But I haven't been able to face figuring out how to do it and then manage the spam, the bots, etc.
13:35:07
Shinmera
if you want to register it, /msg NickServ register should tell you what to do, it's really not hard
13:36:00
beach
I also don't know how to get operator privileges (I guess the creator automatically does), nor what to do with such privileges.
13:38:12
Shinmera
I don't see why not. I'm sure there's also people interested in sicl that don't care about clasp
13:38:28
beach
I guess it won't hurt, and if SICL traffic gets too high here, the discussion can always move.
16:03:29
drmeister
I added you to clasp-developers and added usocket to clasp-developers with write access.
16:06:08
drmeister
General: I switched to 'mosh' yesterday - I did a test where I connect to an AWS machine through my home network and then switch my laptop to connect to the internet through my phone hotspot - it reconnected fine. That's great!
16:06:39
drmeister
I guess it just uses ssh to connect the first time and then uses ports 60000-61000 to maintain the connection.
16:07:00
drmeister
The downside is I have to open ports 60000-61000 on the AWS machine to the world.
16:16:42
Shinmera
drmeister: what is the status of the usocket implementation for clasp? is it complete or?
16:19:19
drmeister
Clasp mimics the ecl/sbcl socket low level functionality. I think it is complete - if it isn't then it's a bug in clasp.
16:20:53
drmeister
When I asked what do we use it for - we use slime, quicklisp, cl-jupyter. Clasp has run McClim with a caveat.
16:21:30
drmeister
I haven't run staple-server but I plan to. I have tried drakma and can't remember the result.
16:22:24
Shinmera
well, I'm working on staple-server now. I just loathe having clones of essential libraries, so I really want this upstream asap