[racket] Test to disambiguate x-expression attributes vs. content?

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Tue Jun 11 09:46:07 EDT 2013

You may have been speaking abstractly but the point is that it is a mostly accurate summary of Xexpr and I use just this form in HtDP/2e to process X-expressions. -- Matthias



On Jun 10, 2013, at 3:27 PM, Jay McCarthy wrote:

> I wasn't referencing the docs. I'm just talking abstractly. The point
> is that you have to consider the attribute list as a totally different
> kind of thing. The thing you cite can be directly turned into a match
> pattern, though:
> 
> (match xe
> [(? string? s) ....]
> [(list (? symbol? tag) (list (list (? symbol? k) (? string? v)) ...) xe ...)
>  ....]
> [(cons (? symbol? tag) (list xe ...))
>  ...]
> etc
> 
> On Mon, Jun 10, 2013 at 1:20 PM, Matthew Butterick
> <mb.list.acct at gmail.com> wrote:
>> Aha, the xexpr-drop-empty-attributes is probably best, since it will produce
>> consistent forms. Thanks.
>> 
>> BTW what part of the docs are you citing for (list* Symbol (option
>> AttributeList) XexprList)? The only definition of X-expressions I'm aware of
>> is here.
>> 
>> 
>> On Mon, Jun 10, 2013 at 11:58 AM, Jay McCarthy <jay.mccarthy at gmail.com>
>> wrote:
>>> 
>>> The type of Xexpr is...
>>> | AtomicContent
>>> | (list* Symbol (option AttributeList) XexprList)
>>> 
>>> It sounds like you have one function F that you would like to give the
>>> type "Xexpr -> Value", but you are having a problem when you apply it
>>> to the AttributeList. You should have such a problem, because an
>>> AttributeList is not an Xexpr, so your types are wrong.
>>> 
>>> In other words, if you want to recursively process an Xexpr, then you
>>> need two functions, one for attribute lists and one for xexpr lists.
>>> 
>>> Finally, I find it convenient when automatically processing Xexprs to
>>> ensure that xexpr-drop-empty-attributes is #f so that there is always
>>> an attribute list and do:
>>> 
>>> (match xe
>>> [(list* tag attrs content) ....])
>>> 
>>> 
>>> 
>>> On Mon, Jun 10, 2013 at 12:40 PM, Matthew Butterick
>>> <mb.list.acct at gmail.com> wrote:
>>>> Consider an x-expression that represents an XML tag, so it has the
>>>> general
>>>> form
>>>> 
>>>> '(tag ((attr-name "attr-value") ... ) content ...)
>>>> 
>>>> The attributes or content might be omitted, of course.
>>>> 
>>>> When I recursively process these expressions, I start by decomposing the
>>>> x-expression into components:
>>>> 
>>>> tag
>>>> ((attr-name "attr-value") ... )
>>>> (content ...)
>>>> 
>>>> The problem that surfaces in a recursive-processing context is that the
>>>> list
>>>> of content might have the same form as an attribute expression, e.g.,
>>>> 
>>>> ((field-1 "value-1") (field-2 "value-2"))
>>>> ((p "some text") (p "some more text"))
>>>> 
>>>> Is there a test I could use to reliably disambiguate between these two
>>>> cases, short of creating a new struct for x-expressions? Seems like I'm
>>>> overlooking some middle ground.
>>>> 
>>>> 
>>>> 
>>>> ____________________
>>>>  Racket Users list:
>>>>  http://lists.racket-lang.org/users
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> Jay McCarthy <jay at cs.byu.edu>
>>> Assistant Professor / Brigham Young University
>>> http://faculty.cs.byu.edu/~jay
>>> 
>>> "The glory of God is Intelligence" - D&C 93
>> 
>> 
>> 
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
>> 
> 
> 
> 
> -- 
> Jay McCarthy <jay at cs.byu.edu>
> Assistant Professor / Brigham Young University
> http://faculty.cs.byu.edu/~jay
> 
> "The glory of God is Intelligence" - D&C 93
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



Posted on the users mailing list.