[prev in list] [next in list] [prev in thread] [next in thread]
List: e-lang
Subject: Re: [e-lang] Interfaces / data types in E
From: Thomas Leonard <tal () it-innovation ! soton ! ac ! uk>
Date: 2011-10-06 15:27:11
Message-ID: 4E8DC8CF.8050309 () it-innovation ! soton ! ac ! uk
[Download RAW message or body]
On 2011-10-06 11:50, Kevin Reid wrote:
> On Oct 6, 2011, at 6:35, Thomas Leonard wrote:
>
>> We've got quite a few methods that take or return maps. e.g.
>>
>> to purchase(customerDetails :Map[String,any]) { ...
>> customerDetails["name"] ... ... if (problem) {
>> notify(customerDetails["email"]) } ... }
>
> When you say "We" do you mean the E project or one of yours?
One of mine.
>> The problem is that it's not obvious from the method signature what
>> keys need to be present. Often someone fails to include a mapping,
>> and the system only fails later in some case where it needed that
>> value.
>>
>> What I think I'd like to do is something like:
>>
>> def CustomerDetails := makeNamedTuple([ "name" => String, "email"
>> => String, ])
>>
>> ...
>>
>> to purchase(customerDetails :CustomerDetails]) { ...
>> customerDetails["name"] ... }
>
> I think this is a fine guard to have. For consistency with other
> parameterized guards, it should be written NamedTuple[[...]].
Good idea.
> Also, I think a better name would be "Record", with one caveat: we
> may wish to introduce record objects at a later time which have
> explicitly defined type objects and non-dynamic fields. Thus perhaps
> "MapRecord" instead...?
>
>> So that:
>>
>> - if the caller fails to provide "name" and "email" then it fails
>> the guard - if I try to access a field I didn't define (e.g. "fax")
>> then I get an error, whether or not the client provided it, so I'm
>> forced to keep the interface up-to-date
>
> The latter requires that the guard wrap its parameter. That is a
> perfectly fine thing to do, but it shouldn't be "normal behavior" and
> so should be clearly indicated in a noun or verb.
Yes, I'm not very happy about the wrapping (especially if you then try
to send the wrapped object over the network). Thinking further, I guess
what I really want is a compile-time check (if something has a
:CustomerDetails guard then it's a compile-time error to use a field not
defined by that type). E doesn't make it easy to add these kinds of
checks at the moment.
>> Any ideas on the best way to do this? Maps? TermTrees?
>
> Term-trees are not suitable for general purposes because they cannot
> contain arbitrary objects (not even arbitrary Data objects).
Good point. We often send SturdyRefs around in these structures.
>> Some of the other systems using this are written in Java, so
>> ideally it should be easy to use from there too.
>
> Since Java idiom would be to define a class to hold the record
> contents, this suggests that the record objects I mention above would
> be a better E idiom than using Maps, if you want interoperation.
How do they work?
--
Dr Thomas Leonard
IT Innovation Centre
Gamma House, Enterprise Road,
Southampton SO16 7NS, UK
tel: +44 23 8059 8866
mailto:tal@it-innovation.soton.ac.uk
http://www.it-innovation.soton.ac.uk/
_______________________________________________
e-lang mailing list
e-lang@mail.eros-os.org
http://www.eros-os.org/mailman/listinfo/e-lang
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic