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