Hi, Diogo! Some unscientific answers.. P1. Yes, it generate
*struct rbuf { uint32_t cap; uint32_t head; uint32_t tail; crunch_u8vector buf;};* sizeof(struct rbuf) = 24 on Intel x86_64 But You can define in scm 'byte' type (define-type Byte (typename uint8_t)) *(define-struct rbufv1 (cap Byte) (head Byte) (tail Byte) (buf bytevector))* sizeof (struct rbufv1) = 16 also if set on packing struct, for example for serialization of data *(c-declare "#pragma pack(1)")(define-struct rbufv2 (cap Byte) (head Byte) (tail Byte) (buf bytevector))(c-declare "#pragma pack()")* *sizeof (struct rbufv2) = 11 again on Intel x86_64* P3. As I understand identifier naming in Crunch is similar to C: underscores,leadchars+[digits] сб, 13 сент. 2025 г. в 16:08, Diogo via Chicken-users < chicken-users@nongnu.org>: > Dear CRUNCHers, I am trying to create a simple ring buffer and here are a > few > issues I encountered. > > The ring buffer is supposed to be very small and only contain bytes. It is > sufficient to have 4 fields: capacity, head, tail, and byte array. > > So I thought this would work: > > (define-struct rbuf > (cap char) > (head char) > (tail char) > (buf bytevector)) > > Problem 1: That generates fields with 32 bits, not chars. I am programming > a > microcontroller with CRUNCH and I want to have full control over such > types. > The following worked, however: > > (define-struct rbuf > (cap (typename uint8_t)) > (head (typename uint8_t)) > (tail (typename uint8_t)) > (buf bytevector)) > > Problem 2: Besides char not enforcing 8 bit fields, I also had the issue > that > I forgot to include (crunch aggregate-types) and `chicken-crunch` gives no > reasonable error (no string) and simply returns an error code != 0. > > Problem 3: Next, I want to define accessors. This is probably my fault, > but the > following code > > (define-compound-accessors (struct rbuf) > (mk-rbuf cap head tail buf) > (cap rbuf-cap) > (head rbuf-head rbuf-head!) > (tail rbuf-tail rbuf-tail!) > (buf rbuf-buf)) > > generates incorrect/unexpected modifier methods, eg, `rbuf-head!` becomes: > > void rbuf_X2dhead_X21(struct rbuf _s, uint8_t _x) { _s.head = _x; } > > Only the copy of the struct in the scope of the function gets modified. I > was > expecting to see this: > > void rbuf_X2dhead_X21(struct rbuf *_s, uint8_t _x) { _s->head = _x; } > > > Any feedback is appreciated. Thank you in advance! > > Best, > - Diogo > >
(import (crunch) (crunch c) (crunch declarations) (crunch aggregate-types)) (define-struct rbuf (cap char) (head char) (tail char) (buf bytevector)) (define-type Byte (typename uint8_t)) (define-struct rbufv1 (cap Byte) (head Byte) (tail Byte) (buf bytevector)) (c-declare "#pragma pack(1)") (define-struct rbufv2 (cap Byte) (head Byte) (tail Byte) (buf bytevector)) (c-declare "#pragma pack()") (c-include <stdio.h>) (define f (c-lambda () void "printf(\"sizeof rbuf %zu vs rbufv1 %zu vs rbufv2 %zu\\n\", sizeof(struct rbuf), sizeof(struct rbufv1), sizeof(struct rbufv2));")) (define (main) (f))
/* GENERATED BY CRUNCH */ #define CRUNCH_IMPORT_CRUNCH_AGGREGATE_TYPES #define CRUNCH_IMPORT_CRUNCH_C #define CRUNCH_IMPORT_CRUNCH #define CRUNCH_IMPORT_CRUNCH_DECLARATIONS #define CRUNCH_IMPORT_CRUNCH_COMPILER_TYPE #define CRUNCH_IMPORT_MATCHABLE #define CRUNCH_IMPORT_CHICKEN_MEMORY_REPRESENTATION #define CRUNCH_IMPORT_CHICKEN_PLIST #define CRUNCH_IMPORT_CHICKEN_TYPE #define CRUNCH_IMPORT_CHICKEN_FOREIGN #define CRUNCH_IMPORT_SCHEME_BASE #define CRUNCH_IMPORT_CHICKEN_SYNTAX #define CRUNCH_IMPORT_CHICKEN_BASE #define CRUNCH_IMPORT_SCHEME_R5RS #ifndef CRUNCH_H #include "crunch.h" #endif struct rbuf { uint32_t cap; uint32_t head; uint32_t tail; crunch_u8vector buf; }; struct rbufv1 { uint8_t cap; uint8_t head; uint8_t tail; crunch_u8vector buf; }; #pragma pack(1) struct rbufv2 { uint8_t cap; uint8_t head; uint8_t tail; crunch_u8vector buf; }; #pragma pack() #include <stdio.h> void f() { printf("sizeof rbuf %zu vs rbufv1 %zu vs rbufv2 %zu\n", sizeof(struct rbuf), sizeof(struct rbufv1), sizeof(struct rbufv2)); } int main(int argc91, char **argv92, char **env93); crunch_function f___ = (crunch_function)f; crunch_function main___ = (crunch_function)main; int main(int argc91, char **argv92, char **env93) { crunch_main(argc91, argv92, env93); long r; // cdiogo.scm:38 // cdiogo.scm:38 f(); r = 0; goto rl; rl: crunch_cleanup(); return r; } /* END OF GENERATED CODE */