freenode/#clasp - IRC Chatlog
Search
15:00:42
whoman
yeah.. just that i see a lot of repetition and such in a few files so i wasnt sure how much of that is done by hand; i forget which file i was looking at last
15:01:25
whoman
;;it has been a long while since i sat down and typed a lot of [C] code though. reading and research these days
15:05:41
beach
So, in bclasp, what happens if you have (say) (let ((x1 ...) (x2 ...) ... (x257 ...)) (lambda (x) (case x (1 x1) (2 x2) ... (257 x257))))
15:07:07
beach
In other words, for that LET to work, it must use a different mechanism than the one used for function calls to create an environment.
15:07:59
Bike
yeah, you'd end up with code that has 137 lexical locations, which are translated into 137 LLVM memory locations, then obviously 137 LLVM SSA variables
15:09:10
drmeister
ACTION never finished "Let over Lambda" because his electronic copy on Apple iBooks has mangled examples.
15:10:12
beach
Bike: obviously, there are fewer than 137 registers, but I still don't understand what allows one but not the other.
15:10:36
drmeister
Could we use LET for calls with more than some number of arguments and the current mechanism for those that do not?
15:10:45
drmeister
Could we use LET for calls with more than some number of arguments and the current mechanism for those that have fewer?
15:11:18
beach
drmeister: I would like to understand why such a thing would be needed, i.e., I would like to know why the LET is fine, but the function call is not.
15:11:19
Bike
the difference isn't the number of arguments, it's that the call is literal. If you have all the arguments right there, and the number of arguments, like in the let, we can put in 137 variables, and that would work for calls
15:11:54
Bike
but with apply, the number of arguments is variable, so we'd have to compile on the fly or just write a different APPLY out depending, and i think the latter is more like what happens, and yes it's bad
15:14:29
beach
Yeah, I am not asking what might work if someone implemented it. I am asking whether they both currently work, i.e. the LET and the LAMBDA form. And if not, what is the difference in the mechanisms used? And if they both work, why is the CALL-ARGUMENTS-LIMIT not applicable to the LAMBDA form?
15:15:29
Bike
I think they would use basically the same mechanism. If the lambda form doesn't work it would be because of an explicit check on parameter counts or something, rather than anything inherent to the mechanism
15:16:26
beach
So by eliminating that explicit check, the CALL-ARGUMENTS-LIMIT could be as high as we like?
15:17:13
drmeister
Currently there is a limit on the number of arguments that can be used in function calls.
15:18:04
drmeister
LET doesn't have this problem because it allocates an arbitrarily large activation frame and evaluates expressions into it.
15:18:26
Bike
there's a difference between compiling a call with a known number of arguments, and implementing apply.
15:19:58
beach
So if, in Cleavir, I turn the LET into a lambda form, I will break programs with a large number of bindings in LET forms?
15:20:30
drmeister
The only way to call a function with three arguments is foo(a1,a2,a3) four arguments bar(a1,a2,a3,a4). How do I call with N arguments?
15:21:17
Bike
Could we have it so that functions with 1-N parameters are special cased, and all other functions have parameter lists (a1, ... aN, valist)?
15:21:40
drmeister
I write the arguments into a vector and then enter a big switch statement, with one entry for each arity and for every arity there is a call like (foo)(args[0],args[1],args[2])
15:23:43
drmeister
Maybe - it will take sitting down and thinking it through - I've rewritten this code half a dozen times in the last 5 years.
15:24:28
Bike
beach: obviously call-arguments-limit should be higher anyway, and there are a few paths we can take to raise it. work, but work that should be done, you know?
15:25:23
drmeister
In the last rewrite I had to impose this limit because of the way that CL functions can now call C++ functions directly. I don't recall exactly what the problem was. This is one of the most painful parts of the C++ interop.
15:25:29
beach
It's not a big deal. It's just that, in Cleavir I have no way of expressing a LET, other than by a function call. So to convert LET, I must basically do a function call, and then let the implementation do it differently if that is not a working solution.
15:25:57
beach
... unless, of course, I introduce some kind of AST for making environments that is separate from the ASTs currently used.
15:26:39
drmeister
beach: Oh - this is what this is about? Do what you need to do in Cleavir - we will fix the implementation on this end.
15:27:09
drmeister
Don't twist the design of Cleavir to meet the peculiar limitations that Clasp currently has.
15:28:34
beach
Bike: I would need a mechanism for creating environments, separate from the existing one.
15:28:48
Bike
I thought the idea was that we would have it as ((lambda (...) (lambda (x) ...)) ...), and then we'd do the cell conversion, and then we could still eliminate the call, and just put the make-cells where the call was.
15:30:16
Bike
Since we don't like... create environments, per se, in HIR, just cells, which are passed to ENCLOSE like arguments.
15:31:31
beach
It all requires the better control-flow and data-flow analysis that we have discussed several times.
15:33:31
drmeister
Bike: I have an issue that just came up with fastgf. I'm running the acid test and an error was triggered:
15:33:46
drmeister
((METHOD CLOS:SLOT-MAKUNBOUND-USING-CLASS (BUILT-IN-CLASS T T)) #<VA-LIST: (#<The STANDARD-CLASS STANDARD-CLASS> #<UNPRINTABLE> 'NIL #<The STANDARD-CLASS STANDARD-CLASS> #<The STANDARD-CLASS CLASS> #<STANDARD-EFFECTIVE-SLOT-DEFINITION CLOS::VALID-INITARGS> )
16:20:26
drmeister
The problem may be with the effective method functions calculated during satiation
17:39:02
drmeister
Bike: if Shiho is there - can you ask her to read the clhs page on make-array, aref, svref and so on? She isn't online at the moment
18:52:43
drmeister
This is driving me nuts. If I build bclasp - it fails because slot-makunbound-using-class invokes the wrong method.
18:54:26
drmeister
(slot-makunbound-using-class #<The STANDARD-CLASS STANDARD-CLASS> #<The STANDARD-CLASS CLASS> #<STANDARD-EFFECTIVE-SLOT-DEFINITION CLOS::VALID-INITARGS>) is invoking the (defmethod slot-makunbound-using-class ((class built-in-class) self slotd) ...)
19:40:03
Serenitty[m]
I finished compiling Clasp on the slow computer, too. So I think it's fair to say that Clasp builds fine on Arch, now.
19:55:13
Serenitty[m]
So, I've generated the bytecode file from the C++ code in the demo, but trying to load the Lisp file results in a crash. I guess Linux compatibility still needs work.
20:35:05
Kevslinger
ACTION likes Common Lisp much much better than the languages being taught in University
20:42:25
Serenitty[m]
Huh, so I went back to open up SBCL, since I felt like using it for doing some Lisp development, but it isn't working anymore. I'm getting the error that it can't find NIL/sbcl.core. That sucks.
20:43:54
Serenitty[m]
Hmm, no. Where should it be set? I have the package from the repositories installed.
20:46:39
Serenitty[m]
Huh. It seems that Emacs is trying to set it whenever I open SLIME. Maybe it has some stuff left over from Clasp. I'll try wiping my cache or whatever there is in my .emacs.d.
20:49:49
Serenitty[m]
Oh no, it's doing it again. Okay, what was your advice? What file should I be grepping?
0:59:26
drmeister
Hmmm - for some reason that problematic generic function is completely bypassing dispatch and going straight to call the effective method.
2:04:16
drmeister
shared-initialize is being called on generic-functions over and over and over again - should that be the case?