Hi Olivier, Olivier Dion <[email protected]> writes:
> On Sun, 03 May 2026, Tomas Volf <[email protected]> wrote: >> Hello, >> >> I am trying to figure out how to define a procedure based on a list of >> fields of some record. I know I can get list of fields for some record >> using `record-type-fields', but I do not know how to do that in a >> syntax-case, since I just see identifier <foo>, but do not know how to >> get the binding. > > You need to have the record definition available at expansion time. > BLUE kinds of do something like this [0] so it can raise an exception if > a field that is not valid for a type is passed. For this, the > definition is evaluated during the expansion. This is necessary because > BLUE types can inherit from parent types and so fields are not just part > of the type definition itself. Note that this is not stricly necessary > if you import the type from another module, since then the definition is > available during expansion. But if the definition is in the same > module, you need to force evaluation during the expansion to get it > define. > > I guess you could also do something similar to what define-module do : > > ice-9/boot.scm: > 3978 #'(eval-when (expand load eval) > 3979 (let ((m (define-module* '(name name* ...) > 3980 #:filename filename quoted-arg ...))) > 3981 (set-current-module m) > 3982 m))))))) > > so that the defined module is available at expansion time throught > (current-module). > > [0] > https://codeberg.org/lapislazuli/blue/src/commit/273e31d8ef3932384f11fd5ac6915c2ac8dffbed/blue/oop.scm#L303 Well, this took me much longer than expected, but I finally have a working version of `define-record-matcher': --8<---------------cut here---------------start------------->8--- (eval-when (expand load eval) (define-record-matcher match-request (@@ (web request) <request>))) (match-request req (method uri) (format #t "~s ~s~%" method uri)) --8<---------------cut here---------------end--------------->8--- So I just wanted to thank you for the pointers above. ^_^ Have a nice day, Tomas -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
