Steve
On Saturday, January 08, 2005 8:34 PM you wrote:
The bootstrap code for SingleInteger does not contain a `one?'
function. On the second iteration the `one?' is compiled,
changing the domain vector for SingleInteger. Propagation is
exactly what is going on here.
Fantastic work! I am totally envious of your obvious skill
with lisp and the Axiom compiler code.
This thing about `one?' reminds of something that has worried
me a while in the Axiom library code. In *many* places throughout
the code there are comments like these in si.spad.pamphlet:
-- not one? c => error "inverse does not exist"
not (c = 1) => error "inverse does not exist"
-- one?(x) == ONEP(x)$Lisp
one?(x) == x = 1
The documentation contains this terse explanation:
"The definition of {\bf one?} has been rewritten as it relies
on calling {\bf ONEP} which is a function specific to Codemist
Common Lisp but is not defined in Common Lisp."
There is no clearly stated author of this text. (Did you write
that Tim?)
Anyway, my concern about this is exactly about the creation
of circular dependencies. Surely such a basic change must
create many new dependencies? Wouldn't if have been much
better simply to provide a GCL compatible lisp expression?
There is an interesting story behind how I tracked this down.
I'll prepare some notes and document some the the lookup
functions used within the compiler runtime.
I'll report back after the build finishes.
I look forward to reading this!
Now from looking at the fixedPoint.log diffs, I think that
there must be at least one more similar propagation.
--- int/algebra/BINFILE.lsp Fri Jan 7 13:13:39 2005
+++ int/algebra/BINFILE.NRLIB/code.lsp Fri Jan 7 13:39:24 2005
@@ -13,7 +13,7 @@
(DEFUN |BINFILE;readIfCan!;$U;6| (|f| $) (PROG (|n|) (RETURN (SEQ (COND
((NULL (EQUAL (QVELT |f| 2) "input")) (|error| "File not in read state"))
((QUOTE T) (SEQ (BINARY_SELECT_INPUT (QVELT |f| 1)) (LETT |n|
(BINARY_READBYTE) |BINFILE;readIfCan!;$U;6|) (EXIT (COND ((EQL |n| -1) (CONS
1 "failed")) ((QUOTE T) (CONS 0 |n|)))))))))))
-(DEFUN |BINFILE;write!;$2Si;7| (|f| |x| $) (SEQ (COND ((NULL (EQUAL (QVELT
|f| 2) "output")) (|error| "File not in write state")) ((OR (QSLESSP |x| 0)
(< 255 |x|)) (|error| "integer cannot be represented as a byte")) ((QUOTE T)
(SEQ (BINARY_PRINBYTE |x|) (EXIT |x|))))))
+(DEFUN |BINFILE;write!;$2Si;7| (|f| |x| $) (SEQ (COND ((NULL (EQUAL (QVELT
|f| 2) "output")) (|error| "File not in write state")) ((OR (QSLESSP |x| 0)
(QSLESSP 255 |x|)) (|error| "integer cannot be represented as a byte"))
((QUOTE T) (SEQ (BINARY_PRINBYTE |x|) (EXIT |x|))))))
(DEFUN |BINFILE;position;$Si;8| (|f| $) (COND ((NULL (EQUAL (QVELT |f| 2)
"input")) (|error| "file must be in read state")) ((QUOTE T) (FILE-POSITION
(QVELT |f| 1)))))
---------
Notice how '(< 255 |x|))' becomes '(QSLESSP 255 |x|))' during
this iteration. It is not clear to me that this change can be
related to a change in the domain vector. Or can it?
Thanks.
Bill Page.
_______________________________________________
Axiom-developer mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/axiom-developer