I am working with event loops in CLX (i.e. event-case). I have the
following clause:
(:client-message (type data format)
(if (and (eql format 32)
(eql type :WM_PROTOCOLS)
(eql (xlib:atom-name *vl-display*
(get-delete-atom data)) :WM_DELETE_WINDOW))
(progn
(setf *vl-running* nil))
t)))
The idea is to exit the event loop and set the running flag to nil so I
can clean up the system and exit an outer loop. This all works fast
and fine. (All my other clauses are similar)
HOWEVER, when I compile this in SBCL I get a ton of warnings, mostly
having to do with the variables type, data, and format inside the IF.
(The values are correct if I print them out.) It seems to have a lot
of trouble also with globals like *vl-display*.
I feel the problem centers around the fact that the variables are not
bound at compile time. But how do I bind them? I tried a Lambda
expression, which gets rid of the errors, but makes the system so slow
it not longer works. As you can probably tell, I'm fairly new to CL
and have a lot to learn. Getting so many warnings just doesn't seen
right, even tough the code works fine.
Well, you asked for it.... (not a pretty sight - get my code seems to
work fine)
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF PROGN
; --> SB-THREAD:WITH-RECURSIVE-LOCK LOCALLY MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION PROGV LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET*
; ==>
; (MAKE-ARRAY (CEILING 160 FORMAT) :ELEMENT-TYPE `(UNSIGNED-BYTE
,FORMAT))
;
; note: unable to optimize because: ELEMENT-TYPE is not constant.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF PROGN
; --> SB-THREAD:WITH-RECURSIVE-LOCK LOCALLY MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION PROGV LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF PROGN
; --> SB-THREAD:WITH-RECURSIVE-LOCK LOCALLY MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION PROGV LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF PROGN
; --> SB-THREAD:WITH-RECURSIVE-LOCK LOCALLY MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION PROGV LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN MULTIPLE-VALUE-BIND
; --> MULTIPLE-VALUE-CALL FUNCTION LET UNWIND-PROTECT FLET BLOCK
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF COND IF COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF
UNWIND-PROTECT
; --> FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN
SB-THREAD:WITH-RECURSIVE-LOCK
; --> LOCALLY MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION PROGV
LET
; --> UNWIND-PROTECT FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL
BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION LET
UNWIND-PROTECT FLET
; --> BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET*
; ==>
; (MAKE-ARRAY (CEILING 160 FORMAT) :ELEMENT-TYPE `(UNSIGNED-BYTE
,FORMAT))
;
; note: unable to optimize because: ELEMENT-TYPE is not constant.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF
UNWIND-PROTECT
; --> FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN
SB-THREAD:WITH-RECURSIVE-LOCK
; --> LOCALLY MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION PROGV
LET
; --> UNWIND-PROTECT FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL
BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION LET
UNWIND-PROTECT FLET
; --> BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF
UNWIND-PROTECT
; --> FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN
SB-THREAD:WITH-RECURSIVE-LOCK
; --> LOCALLY MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION PROGV
LET
; --> UNWIND-PROTECT FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL
BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION LET
UNWIND-PROTECT FLET
; --> BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
; --> XLIB:EVENT-COND LET XLIB::EVENT-LOOP LET XLIB:WITH-EVENT-QUEUE
MACROLET
; --> LET XLIB::HOLDING-LOCK IF HANDLER-CASE BLOCK LET TAGBODY
HANDLER-BIND LET
; --> MULTIPLE-VALUE-PROG1 PROGN RETURN-FROM MULTIPLE-VALUE-PROG1
WITH-TIMEOUT
; --> LET MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION IF
UNWIND-PROTECT
; --> FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN
SB-THREAD:WITH-RECURSIVE-LOCK
; --> LOCALLY MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION PROGV
LET
; --> UNWIND-PROTECT FLET BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL
BLOCK
; --> SB-C::%WITHIN-CLEANUP RETURN-FROM PROGN LOOP BLOCK TAGBODY PROGN
; --> MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL FUNCTION LET
UNWIND-PROTECT FLET
; --> BLOCK MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL BLOCK
SB-C::%WITHIN-CLEANUP
; --> RETURN-FROM PROGN LET XLIB::EVENT-DISPATCH XLIB::READING-EVENT
; --> XLIB::WITH-BUFFER-INPUT LET LET* LET CASE LET COND IF COND IF
COND IF
; --> COND IF COND IF COND IF COND IF COND IF COND IF COND IF COND IF
PROGN
; --> XLIB::BINDING-EVENT-VALUES LET LET LET* DO BLOCK LET TAGBODY
TAGBODY CASE
; --> LET COND IF COND IF COND IF PROGN SETF SB-KERNEL:%ASET LET*
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-SET ARRAY SB-INT:INDEX
SB-C::NEW-VALUE)
;
; note: unable to
; optimize
; due to type uncertainty:
; The first argument is a (SIMPLE-ARRAY * (*)), not a SIMPLE-STRING.
;
; note: unable to
; avoid runtime dispatch on array element type
; because:
; Upgraded element type of array is not known at compile time.
WoodHacker <·······@comcast.net> wrote:
+---------------
| Well, you asked for it.... (not a pretty sight - get my code seems to
| work fine)
+---------------
That's because *none* of those are "errors" -- they're just warnings
[or perhaps one should say "advisories" or "commentary"] that you're
not going to get the absolutely tightest, fastest code the compiler
might possibly be able to give you if you told it a little bit more
about the types of things.
But no errors per se... ;-}
-Rob
-----
Rob Warnock <····@rpw3.org>
627 26th Avenue <URL:http://rpw3.org/>
San Mateo, CA 94403 (650)572-2607
····@rpw3.org (Rob Warnock) writes:
> WoodHacker <·······@comcast.net> wrote:
> +---------------
> | Well, you asked for it.... (not a pretty sight - get my code seems to
> | work fine)
> +---------------
>
> That's because *none* of those are "errors" -- they're just warnings
> [or perhaps one should say "advisories" or "commentary"] that you're
> not going to get the absolutely tightest, fastest code the compiler
> might possibly be able to give you if you told it a little bit more
> about the types of things.
>
> But no errors per se... ;-}
No warnings, either. Those were all notes. To the OP: if you use
Emacs/SLIME, it will categorize SBCL's noise for you into Errors,
Warnings, and Notes. Very handy.
--
/|_ .-----------------------.
,' .\ / | Free Mumia Abu-Jamal! |
,--' _,' | Abolish the racist |
/ / | death penalty! |
( -. | `-----------------------'
| ) |
(`-. '--.)
`. )----'