freenode/#clasp - IRC Chatlog
Search
9:11:17
beach
But if that code is correct, it means that the compiler is called when the code is loaded and that's no good.
9:11:42
makomo
yup! i was eagerly looking to see if he misplaced a backquote somewhere (in which case the code wouldn't show the expansion, but the "expander"), but nope.
9:15:27
beach
... it won't compile the method body in the lexical environment of the DEFMETHOD form.
9:17:38
beach
If make-method-lambda is not called at compile-time, that environment is going to be gone.
9:26:52
makomo
beach: so if capturing the lexical environment is ensured by placing the modified method lambda into the expansion (wrapped in a FUNCTION call), what purpose does the ENVIRONMENT parameter serve in MAKE-METHOD-LAMBDA?
9:27:47
beach
I am not sure. I guess it could be used to look up definitions at compile time. But I haven't found a use for that.
10:05:31
makomo
beach: costanza also says on page 6 "Note that the method body is not processed anymore but can actually be a ’real’ closure, whereas in the approach proposed by the CLOS MOP, method bodies must be s-expressions that are processed by make-method-lambda and then explicitly compiled into method functions. An implication is that such method functions cannot close over local lexical environments, which can be
10:05:57
makomo
but this is in contradiction with http://metamodular.com/CLOS-MOP/processing-method-bodies.html that you linked
10:06:22
makomo
because your link describes exactly how the method function captures the lexical environment
10:36:44
beach
Anyway, my favorite coauthor is going to show up for lunch in a few minutes. So I need to go.
11:51:34
Shinmera
drmeister: If you need specific help with custom staple projects, let me know, though I suggest you first start by trying out projects that have an asdf system to back them
12:22:44
drmeister
The feeling is that the reason llvm is slow is because they want a clean separation of stages.
12:33:12
Bike
beach: i don't think you should have compute-effective-method require the compiler. my reading is that compute-effective-method returns a form, and then we can compile it later. this has turned out well for us.
12:33:46
Shinmera
They might be used to the historically slow compile times of C++ and thus see current LLVM speed as acceptable
12:34:45
beach
Bike: My problem is the following: I want an initial executable without any evaluator in it.
12:35:08
beach
Bike: But then if I load a FASL that defines methods on some generic function, I must compute effective methods for those functions.
12:35:31
drmeister
Shinmera: I think they compare it to GCC and since they do well enough there - there isn't a strong driver to go faster - maybe?
12:35:32
Bike
Oh, how coincidental that I've been looking at how to compile generic function things ahead of time.
12:36:52
Bike
I've worked out a macro that essentially expands into (setf (call-history gf) (list (cons [some specializers] (lambda ...)) ...)), where the lambdas are effective methods
12:40:48
beach
And I guess it doesn't really matter how you obtain that lambda expression, as long as it does what the effective method does.
12:40:58
Bike
though most of it has to do with special cases. if you're okay with every effective method being a function it would be fine.
12:42:23
beach
If you load a fasl that defines a method on an existing generic function, like initialize-instance, you still need the compiler to fix that one up.
12:46:21
makomo
beach: why exactly do you want to avoid having a compiler in the initial image? you mentioned that compiling SICL code within the host is slow or something like that, but i didn't fully understand it
12:46:26
beach
My thinking was to use a different mechanism that does not construct an effective method at all (in the initial image), but just calls the different method functions in some specific order.
12:49:45
beach
makomo: I execute SICL code in SBCL by translating source to HIR and then HIR to Common Lisp. The resulting code is very slow.
12:51:35
beach
Already, I bump the SBCL heap to 10GB. If I add another copy of Cleavir (in the first-class global environment in addition to the host environment), I will need even more.
12:53:07
heisig
It could be worth a try, all the other solutions proposed so far are monumental hacks.
12:56:07
beach
If I gen get the host to compile the compiler, then time might not be such a problem.
12:56:23
makomo
beach: so SICL currently compiles and executes Common Lisp code by... compiling it to Common Lisp for the host to execute? :D
12:56:55
beach
But it is very strange Common Lisp code. It makes no references to the global host environment, only to the first-class global environment it was "tied" to.
12:57:40
drmeister
makomo: Cleavir also runs within Clasp. Within Clasp - Cleavir is used to generate llvm-ir and that is lowered to native code.
12:58:23
makomo
mhm. so this is just one particular language Cleavir is compiling to (i.e. the fact that's it's again CL doesn't matter?)
13:00:12
beach
makomo: Essentially, a source file turns into a single function. Loading a fasl means calling that function with the environment as an argument.
13:01:07
beach
makomo: when that function runs, it installs the definitions of functions etc in the environment, and it loads function cells from that environment so that references to global functions in the source refer to the definitions in that environment.
13:02:08
beach
makomo: So (f ...) turns into (funcall (load-time-value (car (sicl-genv:find-function-cell 'f))) ...)
13:06:21
beach
So the top-level looks sort of like this: (lambda (env) (let ((f-cell (sicl-genv:find-function-cell 'f env))) ... (funcall (car f-cell) ...)))
13:10:25
makomo
so, (f ...) would be SICL code, while (funcall (load-time-value ...)) would be the generated CL code?
13:16:08
makomo
beach: i reread the above about tying a couple of times -- i think i understand now.
13:20:03
makomo
beach: so if you didn't have LOAD-TIME-VALUE, i guess it would still be doable, but you would have to come up how to encode such a thing within the fasl yourself?
13:22:28
scymtym_
context-dependent completion experiment: https://techfak.de/~jmoringe/eclector-context-completion.ogv
13:29:15
scymtym
the processing goes something like emacs+company <-> lsp-mode <-> cl lsp <-> more custom stuff <- concrete-syntax-tree <- eclector
13:36:51
scymtym
Bike: yeah. i made a dedicated emacs mode so i don't mess up lisp-mode and can work on the code in the same emacs
14:19:39
drmeister
Bike: I have CI and buildbot totally figured out. We can automate everything, building branches, running the static analyzer, building docker images.
14:20:26
drmeister
We can use our machines and AWS spot instances. I still need to demonstrate that I can spin up a spot instance to do a particular task and then shut it down again.
14:21:23
drmeister
But I currently have a free-tier AWS machine running the buildbot master and an AWS instance worker building clasp right now and my laptop is hooked in as a worker.
15:29:50
drmeister
Does anyone have feelings about how dangerous it is to open a port (buildbot) on a machine to the world with no ip filtering?
15:30:40
drmeister
Currently I limit access to the IP's of my machines here - but when I'm moving around on my phone that locks me out.
15:38:10
drmeister
"ssh port tunneling" brings back nightmares from my youth when I used to mess around with this sort of thing.
15:52:42
beach
Bike: I misread the Common Lisp HyperSpec before. CALL-METHOD does not supply the method with definition OF CALL-NEXT-METHOD and NEXT-METHOD-P. It supplies the the method with definitions FOR CALL-NEXT-METHOD and NEXT-METHOD-P, in other words it supplies the list of next methods.
15:57:35
beach
My two book projects are slowly rising in importance: 1. Common Lisp reference manual and 2. Common Lisp for language implementers.
16:00:39
Bike
i think MOP (and by extension, some of the more obscure parts of CLOS) could use a rehaul to make a really good standard
16:04:49
Bike
besides the no-next-method thing heisig mentioned earlier (which is what i was thinking of yesterday), the other thing is that mop make-method-lambda and clhs call-method contradict on how many arguments call-method can have; and furthermore make-method-lambda doesn't specify how further arguments to call-method are evaluated
16:08:04
beach
It would be good if you could re-read Pascal's paper, just to confirm what makomo and I think, i.e. that his code in the example expansion is wrong.
16:10:41
Bike
now that's odd because the "Required presence of generic function metaobjects" section is about a problem that arises when make-method-lambda is executed during macroexpansion.
16:13:28
beach
On page 6 he says that the MOP does not allow for method functions to be closures, which is not true.
16:15:15
beach
MAKE-METHOD-LAMBDA can't do anything with the GENERIC-FUNCTION argument, becaue it may not be the one that the method is aimed for.
16:16:07
beach
And the file compiler can store information about the generic-function-class and the method-class, so that it can be accessed by defmethod.
16:17:01
Bike
we actually did have that problem in clasp -inherited from ECL- but jackdaniel redid it to use prototypes.
16:18:05
jackdaniel
like three weeks of insane confusion, 2 minute fix, 5 minute contemplation and poof, never happened
16:19:01
Bike
in this case the file compiler doesn't store information about generic-function-class and method-class, though. could do that too. more compile time information about methods might be nice to have.
16:20:19
beach
Bike: Ah yes, you are still not using a SICL first-class global environment for the Cleavir-based compiler. I am definitely thinking of including that kind of information in those environments for use by SICL.
16:21:17
Bike
nothing standard actually needs that information, i don't think. except make-method-lambda i guess. I was thinking about it in connexion with the effective-method-functions-in-FASLs thing.
16:23:45
Bike
my current macro requires that the generic function actually exists, is actually fbound, actually has all the methods, etc
16:58:59
Bike
call-method is the longest part in this one. for clasp there's a bunch of other junk for the cases where we don't use effective method functions.
17:04:23
beach
I think I will need to attack that in the morning when my brain is still working. This evening, after having had my favorite coauthor over for lunch, and having debugged my method-combination code, I think I am unable to attack some code of this complexity.
17:05:52
beach
But the number of readers may be fairly limited, so perhaps it is better done as a community project with free access to source and PDF.
17:06:21
beach
I had imagined using CreateSpace for on-demand printing as I do for my other book projects.
17:14:30
beach
makomo: It looks like you are interested in SICL/Cleavir. If that is true, do you have something you would like to work on?
17:18:19
beach
OK, today I think I debugged some problems in my implementation of method combinations. Didier Verna told me the design is sane, so that's what I went with.
17:20:00
beach
Given the distractions today (favorite coauthor for lunch, gardener coming over) I think that's a pretty good day after all.
17:22:54
beach
Tomorrow, I'll rewrite COMPUTE-APPLICABLE-METHOD to do what it is supposed to and include code for the consequences of that rewrite.
18:23:33
makomo
beach: i don't have anything particular in mind currently but of what i heard so far -- bootstrapping, FCGEs and Cleavir sound very interesting
18:24:06
makomo
i don't think i'm up to speed with the whole design/goal of the project yet, i still have reading to do
18:26:36
makomo
also, both a new school year and my first job are about to start, so i won't take anything on currently
20:23:51
drmeister
How does Python work? If you have a backtrace and that includes a source file - if you nuke that source file - the code is supposed to stop working right? GARGH - apparently not.