Update List expansion to place in a separate section and remove from Array processing. It is now defined to not support lists containing lists, as this was never properly defined and there is no defined use case.
--- a/spec/latest/json-ld-api/index.html Sun Dec 25 22:46:49 2011 -0800
+++ b/spec/latest/json-ld-api/index.html Mon Dec 26 22:39:08 2011 -0800
@@ -12,6 +12,7 @@
src="http://dev.w3.org/2009/dap/ReSpec.js/js/respec.js" class="remove">
</script>
<script type="text/javascript" class="remove">
+//<![CDATA[
var preProc = {
apply: function(c) {
// extend the bibliography entries
@@ -254,6 +255,7 @@
content = content.replace(/@prefix/g, '<span class="sh_keyword">@prefix</span>');
return content;
}
+//]]>
</script>
<style>
.diff { font-weight:bold; color:#0a3; }
@@ -2608,8 +2610,7 @@
</li>
<li>
If the <tref>JSON object</tref> has a <code>@list</code> key and the value is an <tref>array</tref>
- process the value as a list starting at <a href="#processing-step-list">Step 3.1</a> as if the
- <tref>active property</tref> is the target of a <code>@list</code> coercion.
+ process the value as a list as described in <a href="#list-conversion">List Conversion</a>.
</li>
<li id="processing-step-subject">If the <tref>JSON object</tref> has a <code>@id</code> key:
<ol class="algorithm">
@@ -2652,7 +2653,7 @@
<li>
If the <tref>active property</tref> is the target of a <code>@list</code> coercion,
and the value is an <tref>array</tref>,
- process the value as a list starting at <a href="#processing-step-list">Step 3.1</a>.
+ process the value as a list as described in in <a href="#list-conversion">List Conversion</a>.
</li>
<li>
Otherwise, create a new <tref>processor state</tref> copies of the <tref>active context</tref>,
@@ -2668,60 +2669,14 @@
</ol>
</li>
- <li>
- If a regular <tref>array</tref> is detected
+ <li>If a regular <tref>array</tref> is detected, process each value in the <tref>array</tref>
+ by doing the following returning the result of processing the last value in the <tref>array</tref>:
<ol class="algorithm">
- <li id="processing-step-list">If the <tref>active property</tref> is the target of an
- <code>@list</code> coercion generate an <cite><a href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a></cite> (see [[!RDF-SCHEMA]]) by linking each element of the list using
- <code>rdf:first</code> and <code>rdf:next</code>, terminating the list with <code>rdf:nil</code> using the
- following sequence:
- <ol class="algorithm">
- <li>
- If the list has no element, generate a triple using the <tref>active subject</tref>, <tref>active
- property</tref> and <code>rdf:nil</code>.
- </li>
- <li>
- Otherwise, generate a triple using using the <tref>active subject</tref>, <tref>active property</tref>
- and a newly generated BNode identified as <em>first <tref>blank node</tref></em>.
- </li>
- <li>
- For each element other than the last element in the list:
- <ol class="algorithm">
- <li>Create a processor state using the active context,
- <em>first <tref>blank node</tref></em> as the <tref>active subject</tref>, and
- <code>rdf:first</code> as the <tref>active property</tref>.
- <ol class="algorithm">
- <li>Process the value starting at <a href="#processing-step-associative">Step 2</a>.</li>
- <li>Proceed using the previous <tref>processor state</tref>.</li>
- </ol>
- <div class="issue">There's a bug here, coercion can't take place without using the current
- <tref>active property</tref>, yet we need to pass <code>rdf:first</code> to have the
- appropriate triple changed. Might need a different strategy that relies on using a
- returned value to generate a triple within this context.
- </div>
- </li>
- <li>Unless this is the last element in the list, generate a new BNode identified as
- <em>rest <tref>blank node</tref></em>, otherwise use <code>rdf:nil</code>.</li>
- <li>Generate a new triple using <em>first <tref>blank node</tref></em>,
- <code>rdf:rest</code> and <em>rest <tref>blank node</tref></em>.</li>
- <li>Set <em>first <tref>blank node</tref></em> to
- <em>rest <tref>blank node</tref></em>.</li>
- </ol>
- </li>
- </ol>
- </li>
-
<li>
- Otherwise, process each value in the <tref>array</tref> by doing the following returning the result of
- processing the last value in the <tref>array</tref>:
- <ol class="algorithm">
- <li>
- Create a new <tref>processor state</tref> using copies of the <tref>active
- context</tref>, <tref>active subject</tref> and <tref>active property</tref> and process the value
- starting at <a href="#processing-step-associative">Step 2</a> then proceed using the previous
- <tref>processor state</tref>.
- </li>
- </ol>
+ Create a new <tref>processor state</tref> using copies of the <tref>active
+ context</tref>, <tref>active subject</tref> and <tref>active property</tref> and process the value
+ starting at <a href="#processing-step-associative">Step 2</a> then proceed using the previous
+ <tref>processor state</tref>.
</li>
</ol>
</li>
@@ -2766,6 +2721,46 @@
</li>
</ol>
</section>
+<section id="list-conversion">
+ <h3>List Conversion</h3>
+
+ <p>List Conversion is the process of taking an <tref>array</tref> of values and adding them to a newly
+ created <cite><a href="http://www.w3.org/TR/rdf-schema/#ch_collectionvocab">RDF Collection</a></cite> (see
+ [[!RDF-SCHEMA]]) by linking each element of the list using <code>rdf:first</code> and <code>rdf:next</code>,
+ terminating the list with <code>rdf:nil</code> using the following sequence:</p>
+ <p>The algorithm is invoked with an <tref>array</tref> <em>array</em>, the <tref>active property</tref>,
+ and the <tref>active context</tref> and returns a value to be used as an <tref>active object</tref>.</p>
+ <div class="note">This algorithm does not support lists containing lists.</div>
+ <ol class="algorithm">
+ <li>
+ If <em>array</em> is empty return <code>rdf:nil</code>.
+ </li>
+ <li>
+ Otherwise, generate a triple using using the <tref>active subject</tref>, <tref>active property</tref>
+ and a newly generated BNode identified as <em>first <tref>blank node</tref></em>.
+ </li>
+ <li>
+ For each element in <em>array</em> other than the last element:
+ <ol class="algorithm">
+ <li>Create a processor state using the <tref>active context</tref>,
+ <em>first <tref>blank node</tref></em> as the <tref>active subject</tref>, and
+ <code>rdf:first</code> as the <tref>active property</tref>.
+ <ol class="algorithm">
+ <li>Process the value starting at <a href="#processing-step-associative">Step 2</a>.</li>
+ <li>Proceed using the previous <tref>processor state</tref>.</li>
+ </ol>
+ </li>
+ <li>Unless this is the last element in <em>array</em>, generate a new BNode identified as
+ <em>rest <tref>blank node</tref></em>, otherwise use <code>rdf:nil</code>.</li>
+ <li>Generate a new triple using <em>first <tref>blank node</tref></em>,
+ <code>rdf:rest</code> and <em>rest <tref>blank node</tref></em>.</li>
+ <li>Set <em>first <tref>blank node</tref></em> to
+ <em>rest <tref>blank node</tref></em>.</li>
+ <li>Return <em>first <tref>blank node</tref></em>.</li>
+ </ol>
+ </li>
+ </ol>
+</section>
</section>
</section>