[plt-scheme] (provide ...) question

From: Todd O'Bryan (toddobryan at gmail.com)
Date: Tue May 18 10:30:48 EDT 2010

How would I do that? It looks like if I use

(provide/contract (struct city-line) ...)

there's no way to except the make-city-line constructor, and
with-contract doesn't have a struct version, so I'm afraid I'd have to
provide explicit contracts for every function the define-struct
creates.

Sorry if I'm being dense,
Todd

On Tue, May 18, 2010 at 10:11 AM, Matthias Felleisen
<matthias at ccs.neu.edu> wrote:
>
> I think this is a (known) bug in define-struct/contract.
>
> Also consider exporting a contracted structure instead of defining a struct
> with a contract. Slightly different meanings but the former appears to be
> what you want.
>
>
> On May 18, 2010, at 10:03 AM, Todd O'Bryan wrote:
>
>> Whoops. I tried to simplify the example, and simplified it to the
>> point where it works. It seems that the problem is actually when I try
>> to use define-struct/contract:
>>
>> #lang scheme
>> (provide (except-out (struct-out city-line)
>>                   make-city-line)
>>       (rename-out [better-make-city-line make-city-line]))
>>
>> (define-struct/contract city-line
>>  ([city string?]
>>  [state #px"[A-Z]{2}"]
>>  [zip #px"\\d{5}"]
>>  [zip+4 #px"\\d{4}"]))
>>
>> (define better-make-city-line
>> (case-lambda
>>  [(city state zip zip+4)
>>   (make-city-line city state zip zip+4)]
>>  [(city state zip)
>>   (make-city-line city state zip "")]))
>>
>> causes the error:
>>
>> except-out: identifier to remove `make-city-line' not included in
>> nested provide spec in: (struct-out city-line)
>>
>> Sorry for not checking my example!
>> Todd
>>
>> On Tue, May 18, 2010 at 9:43 AM, Matthias Felleisen
>> <matthias at ccs.neu.edu> wrote:
>>>
>>> In what way doesn't this do "it"?
>>>
>>>
>>> On May 18, 2010, at 8:44 AM, Todd O'Bryan wrote:
>>>
>>>> I have a struct that I'd like to provide from a module, but I'd like
>>>> to provide a different constructor to modules that require it. Here's
>>>> a simple example:
>>>>
>>>> (define-struct city-line (city state zip zip+4))
>>>>
>>>> (define better-make-city-line
>>>>  (case-lambda
>>>>  [(city state zip zip+4)
>>>>   (make-city-line city state zip zip+4)]
>>>>  [(city state zip)
>>>>   (make-city-line city state zip "")]))
>>>>
>>>> I tried this:
>>>>
>>>> (provide (except-out (struct-out city-line)
>>>>                   make-city-line)
>>>>       (rename-out [better-make-city-line make-city-line]))
>>>>
>>>> but that doesn't seem to do it.
>>>>
>>>> Is there a way to do such a thing? Am I close?
>>>>
>>>> Thanks,
>>>> Todd
>>>> _________________________________________________
>>>>  For list-related administrative tasks:
>>>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>>>
>>>
>
>


Posted on the users mailing list.