You need to add a case in parse-expr to deal with annotations, which is in
the form (<expr> : <type>).

E.g.,

[`(,e : ,t) (TA (parse-expr e) (parse-type t))]


On Sun, Mar 15, 2020 at 7:21 AM Adrian Manea <[email protected]>
wrote:

> Hi Matt,
>
> Thank you very much for the details! What you're saying makes sense and is
> in accordance with my intuition. But the code doesn't work as it is.
>
> I created a Gist for it here:
>
> https://gist.github.com/adimanea/7aa7921c913e70fb9a8b1524b5bd2d3c
>
> Everything is from the article, except for the (struct TA (type var))
> which I created instead of the Ann ("type annotation") and the examples I
> used for tests.
>
> Regards,
> Adrian
>
> On Sunday, March 15, 2020 at 2:10:55 PM UTC, Matt Jadud wrote:
>>
>> Hi Adrian,
>>
>> The article seems to be missing a type definition for Ann.
>>
>> Perhaps some of this you already know...
>>
>> (match expr ...)
>>
>> is a pattern matcher, working to find a pattern that 'expr' fits.
>>
>> [(Lam _ _) ...]
>>
>> is attempting to match a pattern where a 'expr' is a struct called Lam,
>> and that structure has two fields. In this case, the value of those fields
>> is ignored, so the variable '_' is used to (by convention, not by syntax)
>> tell the programmer that these values do not matter. (At least, I'm
>> reasonably confident this is by convention and not by syntax.)
>>
>> The form
>>
>> [(Ann e t) ...] is matching the structure 'Ann', and binding the value in
>> the first field to the identifier 'e', and the second value to 't'. Then,
>> the expression following is executed (assuming the pattern matched).
>>
>> In the article, there is no struct definition for 'Ann'. I suspect it is
>> a typo/oversight. This would work:
>>
>> (struct Ann (e t))
>>
>> would be a reasonable definition. It says "Ann" is a data structure with
>> two fields, called "e" and "t".
>>
>> I haven't read the article, so "better" names for those fields is not
>> something I am going to come up with right now. The name in the definition
>> matters (to you, the programmer), but the identifier used to bind in the
>> pattern is not critical. (Or, it is again something that should be
>> important to you, but it does not need to match the names of the fields in
>> the struct definition.)
>>
>> Hopefully that helps, and helps you move forward a bit. Ask more
>> questions if that didn't help. And, perhaps putting your code as-is in a
>> Github Gist or similar, so that others can look at exactly what you're
>> working with would be useful.
>>
>> (I have no idea how complete or incomplete the code in the article is,
>> which is why I suggest you put it in a pastebin/gist to share... there
>> might be other things that were glossed in the article? I don't know.)
>>
>> Cheers,
>> Matt
>>
>>
>> On Sun, Mar 15, 2020 at 10:01 AM Adrian Manea <[email protected]>
>> wrote:
>>
>>> Hi all,
>>>
>>> I'm a mathematician delving into type theory and proof assistants and
>>> with special interests in Racket.
>>>
>>> I'm now trying to understand and implement P. Ragde's Proust
>>> <https://arxiv.org/abs/1611.09473> "nano proof assistant" and work
>>> through the examples in his article. However, I'm pretty much a beginner in
>>> Racket and I'm getting some errors. Particularly in the type-infer
>>> function, that's also used in the type-check function.
>>>
>>> Here is the code in the article:
>>>
>>> (define (type-check ctx expr type)
>>>   (match expr
>>>     [(Lam x t)                           ; lambda expression
>>>         (match type
>>>            [(Arrow tt tw) (type-check (cons `(,x ,tt) ctx) t tw)]     ;
>>> arrow type
>>>            [else (cannot-check ctx expr type)])]
>>>     [else (if (equal? (type-infer ctx expr) type) true (cannot-check ctx
>>> expr type))]))
>>>
>>> (define (type-infer ctx expr)
>>>   (match expr
>>>     [(Lam _ _) (cannot-infer ctx expr)]
>>>     [(Ann e t)  (type-check ctx e t) t]
>>>     [(App f a)                            ; function application
>>>       (define tf (type-infer ctx f))
>>>          (match tf
>>>             [(Arrow tt tw) #:when (type-check ctx a tt) tw]
>>>             [else (cannot-infer ctx expr)])]
>>>     [(? symbol? x)
>>>          (cond
>>>              [(assoc x ctx) => second]
>>>              [else (cannot-infer ctx expr)])]))
>>>
>>> The first question I have is: what's the (Ann e t) supposed to mean,
>>> because I'm getting a syntax error? Is it a type annotation? If so,
>>> shouldn't everything be inside the #lang typed/racket module and type
>>> annotations everywhere?
>>>
>>> Secondly, the functions don't seem to work like this, as I'm getting
>>> failed matches for everything that's not a lambda expression. Can you
>>> please help me clarify the code there or maybe it's already available
>>> somewhere? Because just typing in the examples in the article simply
>>> doesn't work. I can understand what they are supposed to do, but I lack
>>> the skills to fix things myself.
>>>
>>> Thank you!
>>>
>>>
>>> --
>>> 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/6bdfed6a-13c7-4e86-8dcf-5d61b18e15d7%40googlegroups.com
>>> <https://groups.google.com/d/msgid/racket-users/6bdfed6a-13c7-4e86-8dcf-5d61b18e15d7%40googlegroups.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/1cde88c7-0eb8-4cf6-9a80-3708b7e35a6b%40googlegroups.com
> <https://groups.google.com/d/msgid/racket-users/1cde88c7-0eb8-4cf6-9a80-3708b7e35a6b%40googlegroups.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/CADcuegu87gdH%2BLcoPv_FZawaEH_rX95Xv3hLRUU1nQDGJrEqEg%40mail.gmail.com.

Reply via email to