Can compiler macros make use of type declarations?
Antoniotti Marco
antoniotti.marco at disco.unimib.it
Thu Nov 9 10:02:19 UTC 2017
> On Nov 9, 2017, at 10:17 , Chaitanya Gupta <mail at chaitanyagupta.com> wrote:
>
> I tried this on SBCL:
>
> (defun bar (x)
> x)
>
> (define-compiler-macro bar (&whole form x &environment env)
> (when (symbolp x)
> (print (multiple-value-list (clast:variable-information x env))))
> form)
>
> The form below, with the declaration, prints type information correctly:
>
> (compile nil
> (lambda ()
> (let ((y 10)) (declare (fixnum y)) (bar y))))
>>> (:LEXICAL T ((TYPE . FIXNUM)))
>
> However, the one below with no declarations, doesn't give any info:
>
> (compile nil
> (lambda ()
> (let ((y 10)) (bar y))
> (let ((y '(1 2 3))) (bar y))
> (let ((y 'foo)) (bar y))))
>>> (:LEXICAL T NIL)
>>> (:LEXICAL T NIL)
>>> (:LEXICAL T NIL)
>
> So I guess that, at least on SBCL, this is not possible.
Seems plausible. I am not an expert on CMUCL/SBCL type inference, but I’d wager that it does not propagate types as we expect.
BTW. LW behaves in the same way (plus: thank you; I discovered a shortcoming of CLAST LW wrapping that I just fixed).
Marco
>
> Chaitanya
>
>
> On 9 November 2017 at 14:09, Antoniotti Marco
> <antoniotti.marco at disco.unimib.it> wrote:
>> CMUCL and SBCL have the Environment API somewhat available (*)
>>
>> You can see whether they store the inferred values in there.
>>
>> Marco
>>
>> (*) Again, you can have a look at CLAST to see how to access it; I know: it is a shameless plug.
>>
>>
>>
>>> On Nov 9, 2017, at 09:18 , Chaitanya Gupta <mail at chaitanyagupta.com> wrote:
>>>
>>> So thanks to the replies on this I now know that most of the popular
>>> Lisps do support inspecting the environment to figure out declared
>>> types.
>>>
>>> But what about inferred types (e.g. in CMUCL, SBCL)? Do these Lisps
>>> provide a way to know the inferred type of a variable if no
>>> declaration was made explicitly?
>>>
>>> Chaitanya
>>>
>>> On 7 November 2017 at 02:13, Chaitanya Gupta <mail at chaitanyagupta.com> wrote:
>>>> Let's say I have created a function called `FOO`:
>>>>
>>>> (defun foo (x)
>>>> ...)
>>>>
>>>> To optimize this function, I write a compiler macro. Can I make use of
>>>> type declarations that users of `FOO` might have made for the argument
>>>> `X` that is passed in to it?
>>>>
>>>> That is, let's say `FOO` is used like this:
>>>>
>>>> (let ((a (something-that-returns-an-integer)))
>>>> (declare (integer a))
>>>> (foo a))
>>>>
>>>> The compiler macro for `FOO` cannot make any optimizations on the
>>>> value of `A`, but can it take advantage of the fact that `A` is
>>>> declared as in `INTEGER` here?
>>>>
>>>> Chaitanya
>>>
>>
>> --
>> Marco Antoniotti, Associate Professor tel. +39 - 02 64 48 79 01
>> DISCo, Università Milano Bicocca U14 2043 http://bimib.disco.unimib.it
>> Viale Sarca 336
>> I-20126 Milan (MI) ITALY
>>
>> Please check: http://troncopackage.org
>>
>> Please note that I am not checking my Spam-box anymore.
>> Please do not forward this email without asking me first (cum grano salis).
>>
>>
>>
>>
>>
>
--
Marco Antoniotti, Associate Professor tel. +39 - 02 64 48 79 01
DISCo, Università Milano Bicocca U14 2043 http://bimib.disco.unimib.it
Viale Sarca 336
I-20126 Milan (MI) ITALY
Please check: http://troncopackage.org
Please note that I am not checking my Spam-box anymore.
Please do not forward this email without asking me first (cum grano salis).
More information about the pro
mailing list