- From: Sean B. Palmer <sean@miscoranda.com>
- Date: Sat, 13 Oct 2007 14:09:55 +0100
- To: public-cwm-bugs@w3.org
A builtin that returns the last sublist of some list would be very
useful in list processing. For example, given the following list:
_:p1 rdf:first "a" .
_:p1 rdf:rest _:p2 .
_:p2 rdf:first "b" .
_:p2 rdf:rest _:p3 .
_:p3 rdf:first "c" .
_:p3 rdf:rest rdf:nil .
The expression { _:p1 list:lastElement ?sub } should return _:p3.
This would, I believe, be the proper way of resolving my list handling
problem as previously opened on this mailing list [1]. Yosi noted a
workaround [2], which does work but is inefficient and leaves unwanted
triples lying around. Yosi and I discussed this problem on IRC and
decided that a builtin along these lines would be a workable solution.
Here is our discussion, including a sketch of a patch by Yosi. Note
that we disagreed over which name to use for the builtin; I don't
actually mind what it's called.
16:17 <sbp> I figured using list:last would let me bypass that...
because the next step was to parse from the end. seemed a bit of a
pain to have to label down into a list and then process coming back
out of it
16:17 <sbp> would it be possible to make a list:lastSublist builtin perhaps?
16:18 <sbp> or is that infeasible for the same reason?
16:18 <yosi_s> five lines
16:18 <sbp> five lines to create such a builtin?
16:19 * yosi_s looks again
16:19 <yosi_s> exactly nine lines of code in cwm_list.py
16:19 <yosi_s> list:last is so close to what you want
16:20 <yosi_s> its last line is
16:20 <yosi_s> if isinstance(x, EmptyList): return last.first
16:20 <yosi_s> you want
16:20 <yosi_s> if isinstance(x, EmptyList): return last
16:20 <sbp> ah yes, so I see
16:21 <yosi_s> the diff would look like
16:21 <yosi_s> 54a55,63
16:21 <yosi_s> > class BI_lastElem(LightBuiltIn, Function):
16:21 <yosi_s> > def evalObj(self, subj, queue, bindings, proof, query):
16:21 <yosi_s> > if not isinstance(subj, NonEmptyList): return None
16:21 <yosi_s> > x = subj
16:22 <yosi_s> > while 1:
16:22 <yosi_s> > last = x
16:22 <yosi_s> > x = x.rest
16:22 <yosi_s> > if isinstance(x, EmptyList): return last
16:22 <yosi_s> >
16:22 <yosi_s> 133a143
16:22 <yosi_s> > ns.internFrag("lastElement", BI_lastElement)
16:22 <yosi_s> (which is broken, I can't consistently name things today)
16:22 <sbp> sure, I can code that locally; but can it be added to the
swap codebase?
16:22 <sbp> who authorises new builtins these days? :-)
16:24 <yosi_s> I'm not sure I can
16:26 <sbp> I can file an RFE on public-cwm-bugs if that's still the
Right Thing To Do™?
16:26 <yosi_s> sounds reasonable
Given that I had to use the workaround idiom twice in one day, I think
that it's common enough an idiom to warrant having this builtin to do
it more efficiently.
Thanks,
[1] http://lists.w3.org/Archives/Public/public-cwm-bugs/2007Oct/0000
[2] http://lists.w3.org/Archives/Public/public-cwm-bugs/2007Oct/0003
--
Sean B. Palmer, http://inamidst.com/sbp/
Received on Saturday, 13 October 2007 13:10:11 UTC