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.

Reply via email to