[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Chicken-users] define-foreign-enum-type
From: |
John J Foerch |
Subject: |
Re: [Chicken-users] define-foreign-enum-type |
Date: |
Fri, 27 Apr 2012 00:07:28 -0400 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.4 (gnu/linux) |
I think I am beginning to understand. Thank you.
John
Jim Ursetto <address@hidden> writes:
> define-foreign-enum-type also defines a bunch of other stuff that you are
> skipping over
> in your version that compiles, such as garmonbozia->int conversions.
> Specifically
> if you expand the macro you will find it expands to something like
>
> (define-foreign-type garmonbozia "garmonbozia")
> (define-foreign-variable pain "garmonbozia" "pain")
> (define (int->garmonbozia x)
> (cond ((= x pain) 'pain) ;; this line fails to compile
> ... etc. ...)
>
> The reason is Chicken cannot convert the reference to the C
> foreign variable pain to a Scheme value, because "garmonbozia"
> is not a valid Scheme foreign type.
>
> It works fine in the pointer case because you can pass
> around pointers to any foreign type (as it's just a
> C pointer, and Chicken doesn't have to do any conversion).
>
> Jim
>
>
> On Apr 26, 2012, at 9:40 PM, John J Foerch wrote:
>
>> Hello,
>>
>> I am using chicken 4.7.0, and in the course of writing some library
>> bindings, I came upon a difference between define-foreign-type and
>> define-foreign-enum-type that puzzles me. Here is a minimal program
>> that shows it:
>>
>> (import chicken scheme foreign foreigners)
>>
>> #>
>> typedef enum {
>> pain,
>> suffering,
>> fear
>> } garmonbozia;
>>
>> void creepy_dream (garmonbozia *x) {
>> printf("give me back my garmonbozia!\n");
>> *x = fear;
>> }
>> <#
>>
>> ;;; this compiles:
>> (define-foreign-type garmonbozia "garmonbozia")
>>
>> ;;; this does not:
>> ;; (define-foreign-enum-type (garmonbozia "garmonbozia")
>> ;; (garmonbozia->int int->garmonbozia)
>> ;; pain suffering fear)
>>
>> (define (creepy-dream)
>> (let-location ((a int))
>> ((foreign-lambda void creepy_dream (c-pointer garmonbozia))
>> (location a))
>> a))
>>
>> (print (creepy-dream))
>>
>> It compiles and works fine with the 'define-foreign-type' form, but if I
>> comment that one out, and uncomment the 'define-foreign-enum-type' form,
>> I get the following error:
>>
>> Error: illegal foreign return type `garmonbozia'
>>
>> Error: shell command terminated with non-zero exit status 256:
>> /usr/bin/chicken enumpointer6.scm -output-file enumpointer6.c
>>
>> Can somebody explain the difference?
>>
>> Thank you,
>>
>> --
>> John Foerch
>>
>>
>> _______________________________________________
>> Chicken-users mailing list
>> address@hidden
>> https://lists.nongnu.org/mailman/listinfo/chicken-users