freenode/#clasp - IRC Chatlog
Search
13:39:38
beach
Strange question. You would pass them the same way you pass arguments to an ordinary function, no?
13:41:40
drmeister
Yes, but a call to a generic function leads to a call to an effective method where two arguments are inserted in front of the others - that leads to arguments being copied. This is the general case. There are 4 arguments passed in registers maybe I should focus more on that.
13:49:50
beach
Let me make sure. I'll first check what SBCL does and then check the Common Lisp HyperSpec.
13:51:29
drmeister
If it's (m n o) then I could put them in a list (va_list) M and the call becomes (next-method M (cdr B))
13:54:17
beach
"When call-next-method is called with no arguments, it passes the current method's original arguments to the next method."
13:55:32
drmeister
Why say "current method's original arguments". "original" sounds like something other than the "current methods arguments"
13:57:31
beach
Next, with instances of standard-generic-function, I think you can do as you please as we have discussed in the past. For example, if the generic function takes only required parameters (say x y z), you can pass x y z B to the methods, rather than (x y z) B. That way you don't have to cons up a list.
14:00:28
beach
... and you also don't have to shuffle the arguments from the discriminating function to the methods.
14:01:20
drmeister
There is no consing of lists anymore for these arguments - I use the C va_list - at worst it's copying 4 integers on the stack.
14:10:33
Shinmera
drmeister: It says "original" because you might modify the contents of your arguments variable bindings.
14:15:26
beach
If you have keyword parameters, your execution time is going to be dominated by parsing the keyword arguments anyway.
14:36:45
drmeister
beach: Thank you for pointing out that I don't need to pass both sets of arguments - that simplifies things.
14:37:44
drmeister
I know more about modifying the CLOS code to change the calling convention. There are lots of changes scattered about that need to be made in a concerted manner.
18:37:28
drmeister
Hmmm, I added specialized vectors and they aren't being recognized as subtypes of 'vector.
18:39:51
drmeister
I'm relieved - it's breaking ironclad which is breaking cl-jupyter - but it's not some scary function calling thing.
18:43:16
drmeister
I have a complicated multistep procedure to add specialized vector/arrays and it may not yet completely mesh with what the ECL subtypep needs.
19:25:20
drmeister
None of my new specialized array classes are being recognized with (subtypep xxx 'vector) or (subtypep xxx 'array)
19:31:47
drmeister
If anyone has suggestions of how to tie these specialized array classes into the type system so that subtypep works with them - I'd very much appreciate the help.
19:32:31
drmeister
Generic function dispatch with the specialized arrays won't work because (subtypep (class-of arg) 'vector) isn't returning the correct result.
20:13:30
drmeister
It means I still have to weave 'core:simple-vector-int8-t into the SUBTYPEP framework
20:47:17
Bike
'foo and (find-class 'foo) should be identical as far as any type related function is concerned, if the class exists.
20:56:43
drmeister
Adding those classes to hierarchy.lisp was sufficient to get GF dispatch to work properly.
20:58:11
drmeister
The question is then how to make subtypep work. If I told subtypep that these classes are equivalent to 'vector and 'array - I think that might be enough.
20:59:09
Bike
if you tell it a specialized array class is identical to vector it will give wrong answers.
20:59:50
drmeister
Right - what if it says that a specialized array class with one dimension was an array but didn't say it was a vector?
21:00:35
drmeister
Each type (int32, int16 etc) that I have a specialized array on has three new classes.
21:01:11
Bike
But one of those classes includes all specialized arrays with that specialization, including non-vectors?
21:01:24
drmeister
The md-array-xxx and simple-array-xxx are subtypes of array and if DIM=1 subtypes of vector
21:02:20
Bike
"array" refers to a particular set of objects, which includes non-vectors, so array is not a subtype of vector
21:02:55
Bike
if md-array-fixnum is the set of all arrays that are specialized to FIXNUM, md-array-fixnum is not a subtype of vector
21:05:23
Bike
a type is a set of objects. a class is an object that is sometimes identified with a type.
21:05:33
drmeister
An md-array-fixnum can represent an array of fixnums with any rank - those are all subtypes of 'array. It it has rank = 1 is it not a subtype of 'vector?
21:06:26
Bike
that class (or the type identified with it) contains some objects that are vectors, and some that are not.
21:06:43
Bike
since it contains objects that are not vectors, the class/type can't be a subtype of vector.
21:13:10
drmeister
https://github.com/drmeister/clasp/blob/dev/src/lisp/kernel/lsp/predlib.lsp#L1506
21:17:10
Bike
it looks like it canonicalizes types. and for classes it calls register-class. that does i think find-registered-tag to find "classes which belong to the core type system of LISP (ARRAY, NUMBER, etc)"
21:21:45
Bike
that would work except simple-vector doesn't work like that. it would be (simple-array byte32 (*)) i think.
21:51:54
drmeister
I hope it means that (subtypep 'core:simple-vector-byte8-t 'vector) will now return T
21:52:56
drmeister
https://github.com/drmeister/clasp/blob/dev/src/lisp/kernel/lsp/predlib.lsp#L1252