libera/#sicl - IRC Chatlog
Search
9:52:46
beach
In SICL, the FASL file is the printed representation of the AST, so that's the representation of the forms.
9:53:11
jackdaniel
as far as I can tell (based on cursory glance) bir entry point is a "module" that maintains a set of constants and a set of functions (and I don't see where top level forms fall in this picture - as an implicit "init" function perhaps?)
10:24:49
jackdaniel
perhaps the wording is wrong - "how does cleavir represent the code that needs to be executed when the fasl is loaded (in bir)"
10:26:01
beach
And what would be some reasons for not representing that code as the same kind of native instructions that compiled functions contain?
10:27:49
beach
That was in fact my initial plan for SICL. Just mmap() the file and jump to the first address.
10:27:50
jackdaniel
I find it hard to talk to you and I'm too busy to keep rephrasing questions to match exact semantic meaning you'd understand. I'll rephrase it one more time and get back to my tasks and see later whether perhaps bike answered: "how does cleavir /store/ the code (in bir) that needs to be executed when the fasl is loaded"
10:28:43
beach
I am sorry I am getting on your nerves. My question is a serious one. I don't know any answers, and I don't understand the reason for doing it in any other way.
10:29:14
jackdaniel
don't worry, I believe you mean well. that's why I've emphasized that _I_ find it hard
12:00:06
ogamita
It's like in modula-2, each module can have a body, which acts like lisp toplevel. So when we compile each module, we generate a set of functions, but also a module initialization function, that is called when the module is loaded. The linker/loader will generate the calls to module initialization function.
12:03:03
ogamita
In the case of fasl, you may load them with a REPL, so you may keep the same "structure" as source files (this is eg. what clisp does, using just a specific reader macro to read the binary code). Or you may structure the fasl as a mini-heap, and mmap it, then you have lisp objects and you need to have one that refers the toplevel code (a single function or code vector may do). Or your fasl could be some object file (eg. elf), in which
12:03:03
ogamita
case you need to generate explicitely this module initialization function (section), and the linker/loader will call it. Note that even for C, there's some initialization code that is called when loading a shared library, to complete the initialization of globals, etc.
12:18:38
jackdaniel
ACTION wants to only emphasize that he is interested in bir design, not how fasls work / should work
12:21:27
beach
ogamita: No, I said I don't know much about BIR, so Bike shall have to answer the question.
12:40:55
bike
jackdaniel: the cleavir BIR does not work with top level or non top level forms. it's sort of a "pure" compiler that you just give code, so you can use it for compile-file, compile, whatever. you have modules, as you saw, and usually the module will have some kind of "entry point", but that's not required or imposed
12:56:44
bike
in the usual use (and what clasp does), when compile filing each top level form would get its own module, and its entry point is a thunk
15:28:35
beach
I am looking for a solution to configuring a library that supplies standard functionality, potentially as an intrinsic module. I think we have the same issue with Inravina.
15:28:47
beach
So suppose the library has a few standard low-level functions, perhaps just one, the functionality of which must be supplied by client code. Let's call such a function F. The library supplies functions G, H, etc. that can call F to get the low-level work done.
15:28:48
beach
The problem is this: How can a single instance of the library in one Common Lisp image be parameterized so that two different versions of F are called, according to the current value of some *CLIENT* variable somewhere in the system?
15:30:02
beach
And there is no time to bind *CLIENT* between the time the high-level G and H and the time they call F.
15:30:48
beach
So, as I recall, the advice I gave to yitzi was that the client has to define G and H as well, but that is kind of unsatisfactory if there are many similar functions.
15:36:07
beach
Maybe it's a non issue. I guess I'll find out as I work on the condition system. In this case, F is SIGNAL and G and H are WARN, ERROR, etc.
15:45:11
beach
For example, suppose we have a Common Lisp implementation that uses (say) Parcl (the package system) intrinsically. We would like to take advantage of the same code for cross compilation without loading it again as an extrinsic system. But then we might want to change the way some low-level function works for the purpose of cross compilation.
15:46:11
beach
Besides, we can't load it again as an extrinsic system, because the PARCL package would be defined in two different ways in the same Common Lisp image.