Skip to content
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

Open
Jason94 opened this issue Jan 3, 2025 · 6 comments
Open

Coalton fails to eliminate mutual tail calls #1341

Jason94 opened this issue Jan 3, 2025 · 6 comments

Comments

@Jason94
Copy link

Jason94 commented Jan 3, 2025

SBCL is able to eliminate mutual tail calls in the classic worlds-worst even?/odd? algorithm:

(in-package :cl-user)

(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defparameter *n-small* 100)
(defparameter *n-big* 100000000)

(defun odd? (n)
  (declare (fixnum n))
  (if (zerop n)
      nil
      (even? (1- n))))

(defun even? (n)
  (declare (fixnum n))
  (if (zerop n)
      t
      (odd? (1- n))))

(even? *n-big*) ;; ==> Returns T and does not blow the stack

However, the same program in Coalton seems to not eliminate the tail calls and quickly leads to a stack overflow:

(cl:in-package :cl-user)
(defpackage :stack-test
  (:use
   #:coalton
   #:coalton-prelude))
(in-package :stack-test)

(named-readtables:in-readtable coalton:coalton)

(cl:declaim #.coalton-impl/settings:*coalton-optimize*)
(cl:declaim (cl:optimize (cl:speed 3) (cl:safety 0) (cl:debug 0)))

(coalton-toplevel
  (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)))))

(coalton (isodd? n-big))

throwing:

Control stack exhausted (no more space for function call frames).
This is probably due to heavily nested or infinitely recursive function
calls, or a tail call that SBCL cannot or has not optimized away.

PROCEED WITH CAUTION.
   [Condition of type SB-KERNEL::CONTROL-STACK-EXHAUSTED]

Restarts:
 0: [*ABORT] Return to SLY's top level.
 1: [ABORT] abort thread (#<THREAD tid=13032 "slynk-worker" RUNNING {11044843A3}>)

Backtrace:
 0: (ISEVEN? #<unavailable argument>)
 1: (ISODD? #<unavailable argument>)
 2: (ISEVEN? #<unavailable argument>)
 3: (ISODD? #<unavailable argument>)
 4: (ISEVEN? #<unavailable argument>)

Verifying that I did have release mode on:

CL-USER> (uiop:featurep ':coalton-release)
T

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:

; note: unable to
;   open-code FLOAT to RATIONAL comparison
; due to type uncertainty:
;   The first argument is a COMMON-LISP:NUMBER, not a (COMMON-LISP:COMPLEX
;                                                      COMMON-LISP:SINGLE-FLOAT).
; 
; note: unable to
;   open-code FLOAT to RATIONAL comparison
; due to type uncertainty:
;   The first argument is a COMMON-LISP:NUMBER, not a (COMMON-LISP:COMPLEX
;                                                      COMMON-LISP:DOUBLE-FLOAT).
; 
; note: unable to open code because: The operands might not be the same type.
; 
; compilation unit finished
;   printed 45 notes

Testing the CL version without the type declarations, I got similar notes (although fewer of them), but it still did not overflow the stack.

@stylewarning
Copy link
Member

can you show the output of COALTON-CODEGEN? (replace COALTON-TOPLEVEL)

@stylewarning
Copy link
Member

(Also, IFix is a fixnum. Integer is an unbounded size integer.)

@Jason94
Copy link
Author

Jason94 commented Jan 3, 2025

(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)) 

@stylewarning
Copy link
Member

Can you turn the inlining off?

@Jason94
Copy link
Author

Jason94 commented Jan 3, 2025

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.

@stylewarning
Copy link
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants