-
Notifications
You must be signed in to change notification settings - Fork 73
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Coalton fails to eliminate mutual tail calls #1341
Comments
can you show the output of COALTON-CODEGEN? (replace COALTON-TOPLEVEL) |
(Also, IFix is a fixnum. Integer is an unbounded size integer.) |
(cl:print (coalton-codegen
(define n-big 100000000)
(declare isodd? (Integer -> Boolean))
(define (isodd? n)
(if (== n 0)
False
(iseven? (1- n))))
(declare iseven? (Integer -> Boolean))
(define (iseven? n)
(if (== n 0)
True
(isodd? (1- n)))))) (COMMON-LISP:PROGN
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL N-BIG COMMON-LISP:INTEGER)
(COMMON-LISP:SETF N-BIG 100000000)
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'N-BIG 'COMMON-LISP:VARIABLE)
"N-BIG :: INTEGER")
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL ISODD?
COALTON-IMPL/RUNTIME/FUNCTION-ENTRY:FUNCTION-ENTRY)
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL ISEVEN?
COALTON-IMPL/RUNTIME/FUNCTION-ENTRY:FUNCTION-ENTRY)
(COMMON-LISP:DEFUN ISODD? (N-81)
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE N-81))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3410 N-81))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:A-3410))
(COMMON-LISP:LET ((#:B-3421 0))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:B-3421))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B #:B-3421)
(COALTON-LIBRARY/MATH/NUM::A #:A-3410))
(COMMON-LISP:VALUES
(COMMON-LISP:= COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-646
(COMMON-LISP:LET ((#:DICT6574
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM INTEGER|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:DICT6574))
(COMMON-LISP:LET ((#:NUM-2205 N-81))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:NUM-2205))
(- #:DICT6574 #:NUM-2205
(FROMINT #:DICT6574 1))))))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:N-646))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520 #:N-646))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:A-3431520))
(COMMON-LISP:LET ((#:B-3441521 0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-639
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-646))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(- #:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:N-639))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-639))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6412
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-639))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6412))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6412))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6315
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6412))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6315))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6315))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6418
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6315))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6418))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6418))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6321
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6418))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6321))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6321))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6424
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6321))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6424))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6424))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6327
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6424))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6327))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6327))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6430
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6327))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6430))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6430))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6333
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6430))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6333))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6333))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(ISEVEN?
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6333))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1)))))))))))))))))))))))))))
(COMMON-LISP:SETF ISODD? (COALTON-IMPL/RUNTIME/FUNCTION-ENTRY::F1 #'ISODD?))
(COMMON-LISP:DEFUN ISEVEN? (N-82)
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE N-82))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-34136 N-82))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:A-34136))
(COMMON-LISP:LET ((#:B-34237 0))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:B-34237))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-34237)
(COALTON-LIBRARY/MATH/NUM::A
#:A-34136))
(COMMON-LISP:VALUES
(COMMON-LISP:= COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6342
(COMMON-LISP:LET ((#:DICT65740
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM INTEGER|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:DICT65740))
(COMMON-LISP:LET ((#:NUM-22041 N-82))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:NUM-22041))
(- #:DICT65740 #:NUM-22041
(FROMINT #:DICT65740 1))))))
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE #:N-6342))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514 #:N-6342))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:A-3431514))
(COMMON-LISP:LET ((#:B-3441515 0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6445
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6342))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(- #:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE #:N-6445))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6445))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6348
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6445))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6348))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6348))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6451
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6348))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6451))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6451))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6354
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6451))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6354))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6354))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6457
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6354))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6457))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6457))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6360
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6457))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6360))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6360))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6463
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6360))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6463))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6463))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(COMMON-LISP:LET ((#:N-6366
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6463))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6366))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431514
#:N-6366))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431514))
(COMMON-LISP:LET ((#:B-3441515
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441515))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441515)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431514))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
FALSE
(COMMON-LISP:LET ((#:N-6469
(COMMON-LISP:LET ((#:DICT6571518
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571518))
(COMMON-LISP:LET ((#:NUM-2201519
#:N-6366))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201519))
(-
#:DICT6571518
#:NUM-2201519
(FROMINT
#:DICT6571518
1))))))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:N-6469))
(COMMON-LISP:IF (COMMON-LISP:LET ((#:A-3431520
#:N-6469))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:A-3431520))
(COMMON-LISP:LET ((#:B-3441521
0))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:B-3441521))
(COMMON-LISP:LET ((COALTON-LIBRARY/MATH/NUM::B
#:B-3441521)
(COALTON-LIBRARY/MATH/NUM::A
#:A-3431520))
(COMMON-LISP:VALUES
(COMMON-LISP:=
COALTON-LIBRARY/MATH/NUM::A
COALTON-LIBRARY/MATH/NUM::B)))))
TRUE
(ISODD?
(COMMON-LISP:LET ((#:DICT6571524
COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM IFIX|))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:DICT6571524))
(COMMON-LISP:LET ((#:NUM-2201525
#:N-6469))
(COMMON-LISP:DECLARE
(COMMON-LISP:IGNORABLE
#:NUM-2201525))
(-
#:DICT6571524
#:NUM-2201525
(FROMINT
#:DICT6571524
1)))))))))))))))))))))))))))
(COMMON-LISP:SETF ISEVEN? (COALTON-IMPL/RUNTIME/FUNCTION-ENTRY::F1 #'ISEVEN?))
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISODD? 'COMMON-LISP:VARIABLE)
"ISODD? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISODD? 'COMMON-LISP:FUNCTION)
"ISODD? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISEVEN? 'COMMON-LISP:VARIABLE)
"ISEVEN? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISEVEN? 'COMMON-LISP:FUNCTION)
"ISEVEN? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:VALUES)) |
Can you turn the inlining off? |
Well this looks much more reasonable. But unfortunately I'm still getting a stack error: (COMMON-LISP:PROGN
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL N-BIG COMMON-LISP:INTEGER)
(COMMON-LISP:SETF N-BIG 100000000)
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'N-BIG 'COMMON-LISP:VARIABLE)
"N-BIG :: INTEGER")
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL ISODD?
COALTON-IMPL/RUNTIME/FUNCTION-ENTRY:FUNCTION-ENTRY)
(COALTON-IMPL/GLOBAL-LEXICAL:DEFINE-GLOBAL-LEXICAL ISEVEN?
COALTON-IMPL/RUNTIME/FUNCTION-ENTRY:FUNCTION-ENTRY)
(COMMON-LISP:DEFUN ISODD? (N-55)
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE N-55))
(COMMON-LISP:IF (COALTON-LIBRARY/MATH/NUM::|INSTANCE/EQ INTEGER-COALTON-LIBRARY/CLASSES:==|
N-55 0)
FALSE
(ISEVEN?
(1- COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM INTEGER|
N-55))))
(COMMON-LISP:SETF ISODD? (COALTON-IMPL/RUNTIME/FUNCTION-ENTRY::F1 #'ISODD?))
(COMMON-LISP:DEFUN ISEVEN? (N-56)
(COMMON-LISP:DECLARE (COMMON-LISP:IGNORABLE N-56))
(COMMON-LISP:IF (COALTON-LIBRARY/MATH/NUM::|INSTANCE/EQ INTEGER-COALTON-LIBRARY/CLASSES:==|
N-56 0)
TRUE
(ISODD?
(1- COALTON-LIBRARY/MATH/NUM::|INSTANCE/NUM INTEGER|
N-56))))
(COMMON-LISP:SETF ISEVEN? (COALTON-IMPL/RUNTIME/FUNCTION-ENTRY::F1 #'ISEVEN?))
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISODD? 'COMMON-LISP:VARIABLE)
"ISODD? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISODD? 'COMMON-LISP:FUNCTION)
"ISODD? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISEVEN? 'COMMON-LISP:VARIABLE)
"ISEVEN? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:SETF (COMMON-LISP:DOCUMENTATION 'ISEVEN? 'COMMON-LISP:FUNCTION)
"ISEVEN? :: (INTEGER → BOOLEAN)")
(COMMON-LISP:VALUES)) It's generating pretty much the exact same code that I wrote in Common Lisp, so I'm not sure why it wouldn't work. |
one guess: coalton is adding type decls to the results of the function and SBCL is compiling that into a type check and that's killing the tail call. |
SBCL is able to eliminate mutual tail calls in the classic worlds-worst even?/odd? algorithm:
However, the same program in Coalton seems to not eliminate the tail calls and quickly leads to a stack overflow:
throwing:
Verifying that I did have release mode on:
Probably not related to the stack overflow, but I did get these 45 compiler messages when compiling the Coalton program. I was surprised, because I thought that the Integer type annotation would be enough to give SBCL the equivalent fixnum declaration:
Testing the CL version without the type declarations, I got similar notes (although fewer of them), but it still did not overflow the stack.
The text was updated successfully, but these errors were encountered: