If you're willing to accept a low tech solution, might I suggest this: $ perl -i.bak -lpe 's/\(foo/\(make-foo/g' *.rkt
Also, I'll self-plug and point you towards this: #lang racket (require struct-plus-plus ) (struct++ foo ([a real?]) (#:omit-reflection) #:prefab) (define checked (foo++ #:a 7)) ; contract is checked (define not-checked (foo 7)) ; contract is not checked (writeln checked) (writeln not-checked) This defines the contracts using define/contract. It's not clear to me if that meets your needs, but hopefully it does. On Mon, May 10, 2021 at 10:03 AM Sage Gerard <[email protected]> wrote: > I hope so! That's what I understood option B to mean. > > I could adjust the define-message macro according to the info in Ryan and > Phillip's attachments, but I'm not well-educated on trapping struct > operations. Phillip: Your example and email gives me the impression that > when you add a chaperone, you can proxy all struct operations, including > the gap left by the chaperone for the constructor. Is that true? > > The macro I'd want has to preserve *all* characteristics of *all* > generated struct bindings, which makes things tricky since the options for > `struct` normally operate on a strict subset. e.g. > #:[extra-]constructor-name seems to operate on the constructor alone, and > the #:extra- variant does not preserve the match-expander/super-id > characteristics. #:constructor-name is closer, but the original constructor > id is no longer directly callable by the declaring module. > On 5/10/21 7:05 AM, Hendrik Boom wrote: > > On Sun, May 09, 2021 at 10:23:34PM +0000, Sage Gerard wrote: > > I have a project with 57 prefab structure types. I need to construct > instances using a local contract (module level contracts do not fit my needs > here). Since I cannot define guards, the solution is easy enough. > > (struct foo (num) #:prefab) > (define/contract make-foo (-> real? foo?) foo) > > Problem: I already have a few hundred constructor calls without > contracts. I could either A) rewrite them all to use contracted > constructors, or B) attach local contracts in a sweet spot so that I > don't have to rewrite anything else. > > Is there any chance you could do the "rewriting" in a macro so you > wouldn't actually have to change the few hundred constructor calls > when you use option A)? > > -- hendrik > > > I prefer option B, but it doesn't look like I can attach a local contract to > a constructor with `struct` alone, or even with an impersonator. When I hack > around to rebind or hide the constructor's identifier, I break compatibility > with `match` and `defstruct*`. > > If you were in my position, what would you do? > > -- > > ~slg > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/0a16cfbe-4789-a939-796e-5f6f9da21626%40sagegerard.com. > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/20210510110509.cpg6jnil6th7xbsi%40topoi.pooq.com. > > -- > ~slg > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/94e81fc9-e8a1-e677-bf0e-b49e597313b9%40sagegerard.com > <https://groups.google.com/d/msgid/racket-users/94e81fc9-e8a1-e677-bf0e-b49e597313b9%40sagegerard.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAE8gKofQDbSrOS1n-i7B-T0h78x%2Bz0NRdUkZx6-1T9FyxBspBQ%40mail.gmail.com.

