freenode/#clasp - IRC Chatlog
Search
15:03:45
beach
The environment argument to the compiler does not have to be the same as the global environment in which the compiler executes.
15:04:21
Bike
that's what i thought, but i understood what you said just now about compiler having to execute in E2 as meaning otherwise.
15:04:53
beach
"executing in E2" just means that its run-time environment has E2 as its global part.
15:06:49
beach
Clearly, by default, as seen by any old application-programmer, if a compilation is started, then E2 will also be the one given to the compiler.
15:07:43
beach
But if you want to do something out of the ordinary, you can definitely pass any environment you like to the compiler. You are then assumed to have read up on the semantics of such a stunt.
15:08:56
beach
I take macros and stuff from one environment and then load the code into a different environment.
15:10:55
beach
Here is a much simpler scenario: The Common Lisp HyperSpec allows (encourages?) for the compilation environment to be different from the startup environment.
15:11:08
Bike
okay, so going with the actual thing where this came up, you're saying that it's okay for function definitions to not match between the environment the compiler is running in and the environment it's passed, but that package definitions do have to match? (with the understanding that you can't necessarily invent these semantics in real time)
15:12:34
beach
By having the compilation environment distinct from the startup environment, you avoid that side effects during compilation affect the startup environment.
15:12:48
Bike
my understanding was that this unusual bootstrapping situation was basically a core feature - so that, in order to make it easier, pretty much any mismatch would be allowed.
15:13:56
Bike
mm. right. (with relation to compilation and loading the clhs has an interesting restriction on that)
15:14:27
beach
Yes, there are already restrictions, and in many cases the behavior is undefined if they are not respected.
15:14:58
beach
I think the "system programmer" will want to have such situations defined so that they can be exploited.
15:15:49
Bike
well i mean we're talking about different restrictions here, i think. CL has an environment the compiler is running in, and an environment the compiled code is loaded into. we have an environment the compiler is running in, an environment the compiler is "compiling in" (including eval-ing eval-when things, etc), and an environment compiled code is loaded into.
15:16:21
beach
The restrictions are different, sure. I was referring to the spirit of such restrictions.
15:19:34
beach
For bootstrapping SICL, I am convinced (but not 100% sure of course) that I need multiple global environments simultaneously active. When I do things like (defclass standard-class (class) ....) I need to fetch one definition of standard-class from one environment and define that class (differently) in a different environment.
15:21:02
Bike
so that it does like (setf (find-class 'standard-class E2) (make-instance (find-class 'standard-class E1) ...))?
15:21:48
Bike
and then later you alter standard-class/E2 so that it's an instance of itself instead of of standard-class/E1?
15:27:02
Shinmera
This is only tangentially relevant, but I can't seem to find it: is it specified anywhere that changing the metaclass is not allowed?
15:27:49
Shinmera
If so, how would you handle cases where this is necessary? Perhaps not in SICL directly, but generally I come across this issue sometimes when I develop, and I imagine it would be one too for runtime-update systems like your LispOS
15:28:14
Colleen
Clhs: standard generic function change-class http://www.lispworks.com/documentation/HyperSpec/Body/f_chg_cl.htm
15:30:13
beach
Cross compilation is another scenario where an explicit compilation environment is required.
15:30:29
Bike
the semantic restrictions do include a bit that the metaclass of a class can't change between compile time and runtime, but i don't know what restricts metaclasses from being changed /at all/, if anything
15:30:34
beach
You can't rely on the host having first-class global environments, and even if it did, you would want the target definition of macros and such.
15:32:25
beach
In fact, in the past, I thought it might be advantageous to bootstrap Clasp by compiling its files by having Cleavir run in SBCL, using a first-class global environment that resembles that of Clasp's global environment.
15:35:34
Bike
it would be, no question. we'd have to have a C++ runtime (as now), and a cleavir-in-sbcl that can dump fasls appropriate for that runtime. i don't know if drmeister wants a dependency on sbcl (but we already have one, so)
15:35:43
beach
Shinmera: The metaclass of a class determines how slots are represented, so it would be nearly impossible to change the metaclass of a class, at least of the class has instances.
15:36:42
Bike
change-class on sbcl signals an error. mop says, in "initialization of class metaobjects" (in chapter 6) that "Portable programs must not call change-class to change the class of any class metaobject or to turn a non-class object into a class metaobject."
15:49:00
beach
Bike: Sorry I lost it. I guess I am frustrated that I am not able to make progress faster than I am. And it worries me that I am unable to explain my vision of things to do, which puts even more pressure for me to make faster progress.
15:49:56
beach
Plus, "paging" is very hard for me, so going from CST to first-class global environments to McCLIM is not easy.
16:02:45
Bike
yeah, sorry. when i ask you about stuff it's because i'm out of ideas (or am unsure that something fits your philosophy), i try not to be dependent
16:03:32
Bike
also, i remembered the real reason we don't boot from sbcl or something: the compiler uses llvm, which is C++, so we can't use it from lisp unless it's clasp
16:04:07
Bike
writing a different llvm-sys layer in terms of the c bindings so that we could use it from sbcl might still be better than maintaining an entire compiler only used for bootstrapping, tho
16:06:20
Shinmera
Probably because there's too much of a gamble involved. It's not something one can quickly try out after all.
16:10:09
beach
But if I were drmeister, with all those grants, I might consider some parallel development of alternatives, just to see whether it would be better. I mean, it's taxpayer's money and it is meant to be spent. But then, I am not drmeister, so the issue is moot.
16:11:04
Shinmera
I figure if he were in a computer science department that would be justified, but given that he's supposed to mostly be a chemist, I don't know how much leeway he has.
16:12:58
Bike
well, i understand it not being a big priority. it's really annoying, but users aren't going to build it much
16:13:13
drmeister
We have a working system right now. I want to start using it. The funding I have is to use it to design molecules. Not to rewrite it.
16:13:16
beach
drmeister: Yeah, I am not so convinced. But then, you already know that. This is #clasp, so I should try not to air my opinions too much.
16:14:51
Shinmera
ACTION is glad he doesn't have the burden of having created a new implementation when he can't even get a chat system to be stable
16:19:42
beach
Bike: I am hoping that the CST stuff is converging. So far, whenever I have worked on CST-to-AST, I have found more stuff to add to the CST library, either because it is in cleavir-code-utilities or because it should have been in the first place.
16:20:18
beach
Like, today, I found the need to canonicalize LET bindings in the form of CSTs, preserving source information, of course.
16:20:40
Bike
yeah, that makes sense. the more i went into code utilities the more environment dependent stuff i hit
16:20:55
beach
I'll continue like that. Grab something from Generate-AST and try to port it to CST-to-AST, see what is missing from CST, implement it, iterate.
16:23:42
beach
I am still willing to cough up 3k€ over 6 months to have someone help me with some things, but I don't want to make a general announcement for candidates. I would rather select someone I know to be able to help.
16:25:17
drmeister
beach: On that - I can also support good candidates to work on Cleavir related code. Anything that speeds it up, improves debugging etc. I also have more clasp related projects and problems.
16:28:31
drmeister
It's easier if they are in the US but I'd put work into figuring out how to support good programmers anywhere.
16:31:04
drmeister
Bike is going to be here through next summer (the job posting just went up) and he and I can coordinate and guide programmers elsewhere.
16:37:33
Shinmera
I have no idea whether I'd qualify, but if I manage to finish my bachelor's by summer next year I might be open for hire.
16:40:23
drmeister
Do you know how to program in Common Lisp? Are you willing to get your hands dirty with C++ and runtime issues? Are you looking for fame and fortune?
16:42:26
Shinmera
So far I'm reserving a year of time for "whatever" after my bachelor's, so it's not like I have any urgency in the matter.
16:42:53
drmeister
I bring up the runtime because while a large part of what Bike is here to do is to improve Clasp by improving Cleavir - the runtime keeps intruding.
16:45:41
beach
My (admittedly small) family says that dinner is ready. I might check in briefly later.
16:53:41
Colleen
Standard-instance-access http://metamodular.com/CLOS-MOP/standard-instance-access.html
18:10:42
Bike
is it okay to only check information in a THE that the inferencer uses? like if we have (the (and list (satisfies proper-list-p)) ...) the actual check is just for list.
19:04:45
Bike
huh, the hyperspec suggests slot-exists-p be implemented in terms of clos:slot-exists-p-using-class which does not exist
19:29:47
drmeister
So standard-instance-access is another thing I need to check for if I implement accessors in the dispatch function?
19:30:40
drmeister
I'm not grumbling - I'm resigned and interested in optimization strategies that are compliant.
19:32:29
drmeister
If standard-instance-access is a generic function then programmers can write methods on it and accessors in dispatch functions need to be aware. It may be that programmers are not allowed to write methods on standard-object specializes.
19:33:18
Bike
it's the really low level function. something like (defun standard-instance-access (instance location) (aref (instance-slots instance) location))
19:35:12
Bike
standard-instance-access is not defined in my clasp. i think there are internal standard-instance-get and standard-instance-set that basically do it, though
19:51:39
drmeister
I think they are instanceRef and instanceSet. Virtual functions but fastgf will improve that
20:03:54
Bike
i guess the basic issue is, THE considered as a type check operation has to evaluate a form, do something with /some of/ the values, and then return those same values
20:04:08
Bike
which there's no way to do in CL other than like multiple-value-list, which is not what we want to do
20:31:51
Bike
right now it works by context: types are checked if a fixed number of values are used. i think that's fine. (multiple-value-call foo (the integer x)) won't type check x, but that's quite rare anyway
20:38:05
Bike
to do that with the new stuff, the implementation would basically need to provide a form for each type, that does the test. and a primitive type. like (the integer x) would be a the-ast with types ((or fixnum bignum)), and with asts [result of converting (unless (typep x 'integer) (error 'type-error ...))]
20:39:37
Bike
and then in hir if it was in a values context it would be totally discarded; otherwise it's a THE instruction or whatever that typep compiles into, depending on safety policy
20:44:39
Bike
but if cl type logic is moved up to source level - which makes sense to me - something like that has to happen anywy
20:47:38
Bike
right now they get preserved all the way down to HIR, which is why typeq instructions are converted into typep calls
20:48:33
Shinmera
But you'd still need some form of type information at the lower levels in order to transformations, yeah?
20:48:58
Shinmera
Sorry if I'm asking things that you've already stated before-- I haven't been keeping up with this as much as I'd like
20:49:16
Bike
the (new) idea is there's only "primitive" type information - some set of "simple" types defined by the implementation that it can check easily
20:50:21
Shinmera
From my understanding of information in compiler optimisation I would expect the kind of information to get more complex as you go down the compilation, rather than becoming more simple.
20:51:43
Bike
well, so, inference understands types that are either primitive, or a join (or ...), or a negation of a join
20:53:26
Bike
the idea is that all the primitive types are disjoint, so (and ...) is usually unneeded
20:54:59
Shinmera
Anyway, I'm just thinking in terms of like classes where things like (and foo bar) would make a lot of sense even if there is not necessarily a concrete class that implements exactly this conjunction
20:55:39
Shinmera
Since you could have two classes that share both foo and bar, but have other superclasses as well.
20:57:29
Shinmera
Eg (declare (type (and a b) x)) (typecase x (a ..) (b ..) (c ..)) b and c can be eliminated.
20:58:33
Bike
there's certainly a lot more types that could be dealt with. like... any kind of type theory, for one. but right now i pretty much just want to speed up arithmetic and such
21:00:15
Bike
that should be like, 90% of it really. after that is kind of diminishing returns i think. interesting returns, but still
21:02:29
Shinmera
I don't know. In the absence of something like SBCL's deftransform, not being able to eliminate a lot of typecasing and such is going to be a burden.
21:04:33
Shinmera
I mean, I'm mostly just FUDing here, since I have no real evidence to back up my fears.
21:05:10
Shinmera
I'm just concerned that code might bloat a lot if the inference isn't smart enough and there's no mechanism to do more precise code transformation than compiler macros
21:07:14
Bike
but right now? i mean, i only just fixed it up so that calling map doesn't do a bunch of subtypep calls
22:27:31
Bike
by the time cleavir typeq is changed, every last bug in the primitive typeq will have been found :v
0:36:06
drmeister
I can automatically convert plists to these Python like dicts by converting the symbol keys with (camelize (string-downcase (string key))) where :the-key -> "theKey" (what nglview expects).
0:37:40
drmeister
There's a question about exactly when I convert the plists to dicts - I'd like to do it as late as possible.
0:38:30
drmeister
There are other issues in that these dictionaries get sent back and forth between the kernel and the javascript frontend as JSON dictionaries.
2:51:21
beach
Bike: I need to re-read what you wrote and ask questions about it. But I am still working on my morning coffee.