Something went wrong while setting issue due date.
Declaimed Optional Types Lead to Bad Type Inference
Minimal test case:
(declaim (ftype (function (real &optional real) real) foo))
(defun foo (a &optional b)
(cond (b (+ a b))
(T (+ a 1))))
This only works when compiled and then loaded, so save to file, (load (compile-file "test.lisp"))
. Calling the function like (foo 1)
then results in an error:
NIL is not of type REAL.
[Condition of type TYPE-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*PROCESS-INPUT] Continue reading input.
2: [ABORT] Return to SLIME's top level.
3: [CLOSE-CONNECTION] Close SLIME connection.
4: [RESTART-TOPLEVEL] Go back to Top-Level REPL.
Backtrace:
0: DEBUG-IN-EMACS
1: INVOKE-SLIME-DEBUGGER
2: G992
3: CALL-WITH-DEBUGGER-HOOK
4: SWANK-DEBUGGER-HOOK
5: FOO
6: #<bytecompiled-function BYTECODES>
7: EVAL-REGION
8: G102
9: TRACK-PACKAGE
10: G101
11: CALL-WITH-RETRY-RESTART
12: G100
13: CALL-WITH-BUFFER-SYNTAX
14: REPL-EVAL
15: LISTENER-EVAL
16: #<bytecompiled-function BYTECODES>
17: EVAL-FOR-EMACS
18: PROCESS-REQUESTS
19: G372
20: HANDLE-REQUESTS
21: G651
22: CALL-WITH-BINDINGS
23: REPL-INPUT-STREAM-READ
24: G643
25: G226
26: CALL-WITH-LOCK-HELD
27: G225
28: SIMPLE-REPL
29: G594
30: G585
31: CALL-WITH-USER-BREAK-HANDLER
32: G582
33: CALL-WITH-DEBUGGER-HOOK
34: G626
35: CALL-WITH-BINDINGS
36: SIMPLE-SERVE-REQUESTS
37: SERVE-REQUESTS
38: ACCEPT-CONNECTIONS
39: SERVE
40: SERVE-LOOP
41: SETUP-SERVER
42: START-SERVER
43: #<bytecompiled-function BYTECODES>
--more--
So most likely ECL just doesn't augment the proclaimed optional type with (or null ..)
.