[racket-dev] redex metafunction contract for two separate languages?

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Mon Feb 6 07:59:35 EST 2012

How will you disambiguate them on the printed page for readers of your paper?

Robby

On Sun, Feb 5, 2012 at 9:36 PM, Neil Toronto <neil.toronto at gmail.com> wrote:
> I think in my case I actually do want the same nonterminal names. The
> higher-order language has lambdas while the first-order language doesn't.
> The first-order language has an outer `let' while the higher-order language
> has no `let'. Every other kind of expression is the same and has the same
> reduction rules in each language.
>
> Neil ⊥
>
>
> On 02/05/2012 03:58 PM, Robby Findler wrote:
>>
>> Yes, you guys are right-- this is not supported. You'd have to put
>> everything into a single language to make it work.
>>
>> I've shied away from this because it seems overly complicated, but
>> also because the language names ("L1" and "L2" in Stephen's example)
>> don't show up anywhere in the typeset version of the model. So in
>> order to really be clear, you want to have different non-terminals
>> anyway, and then it seems like putting things into the same language
>> is not problematic.
>>
>> But if you have some more context in the example that suggests my
>> reasoning is flawed, I'd love to hear it.
>>
>> Robby
>>
>> On Sun, Feb 5, 2012 at 4:46 PM, Neil Toronto<neil.toronto at gmail.com>
>>  wrote:
>>>
>>> On 02/05/2012 03:11 PM, Stephen Chang wrote:
>>>>
>>>>
>>>> I want to write a redex metafunction contract that goes between two
>>>> languages. Is there currently a way to do this?
>>>>
>>>> For example,
>>>>
>>>> #lang racket
>>>> (require redex)
>>>>
>>>> (define-language L1
>>>>   (e 1))
>>>> (define-language L2
>>>>   (f 2))
>>>> (define-metafunction L1
>>>>   L1->L2 : e ->    f
>>>>   [(L1->L2 1) 2])
>>>>
>>>>> (term (L1->L2 1))
>>>>
>>>>
>>>> . . ..\..\plt\collects\redex\private\error.rkt:3:0: L1->L2: codomain
>>>> test failed for 2, call was (L1->L2 1)
>>>>
>>>> Switching the metafunction language to L2 similarly produces an error
>>>> about the domain. Currently it seems like I can't use a contract with
>>>> these kinds of metafunctions. How difficult would it be to support
>>>> this functionality? It seems like this use case should be pretty
>>>> common.
>>>>
>>>> I'm imagining something like:
>>>>
>>>> (define-metafunction
>>>>   L1->L2 : L1:e ->    L2:f
>>>>   [(L1->L2 1) 2])
>>>
>>>
>>>
>>> I'd like to know this myself. I'll be transforming terms from a
>>> higher-order
>>> language to a first-order one via closure conversion. Neither language is
>>> an
>>> extension of the other, so I can't use `defined-extended-language'. The
>>> only
>>> way I've thought of so far is to make a third language that is a superset
>>> of
>>> both.
>>>
>>> Neil ⊥
>>>
>>> _________________________
>>>  Racket Developers list:
>>>  http://lists.racket-lang.org/dev
>
>


Posted on the dev mailing list.