<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
When digesting the CTM tutorial at the TMRA 2008 (thanks to Lars
Heuer), these issues arised to me:<br>
<br>
(In subsequent discussion, related issues also arised to others.)<br>
<br>
When including files, the question arises how to treat name clashes,
like the following:<br>
<ol>
  <li>case 1</li>
  <ul>
    <li>file1.ctm:<br>
%prefix foo <a class="moz-txt-link-freetext" href="http://bar/1/">http://bar/1/</a></li>
    <li>file2.ctm:<br>
%prefix foo <a class="moz-txt-link-freetext" href="http://bar/2/">http://bar/2/</a></li>
    <li>file3.ctm:<br>
%include file1.ctm<br>
%include file2.ctm<br>
%prefix foo <a class="moz-txt-link-freetext" href="http://bar/3/">http://bar/3/</a><br>
foo:some_topic</li>
  </ul>
  <li>case 2<br>
  </li>
  <ul>
    <li>file1.ctm:<br>
def foo() <a class="moz-txt-link-freetext" href="http://bar1/some_topic">http://bar1/some_topic</a> end</li>
    <li>file2.ctm:<br>
def foo() <a class="moz-txt-link-freetext" href="http://bar2/some_topic">http://bar2/some_topic</a> end</li>
    <li>file3.ctm:<br>
%include file1.ctm<br>
%include file2.ctm<br>
def foo() <a class="moz-txt-link-freetext" href="http://bar3/some_topic">http://bar3/some_topic</a> end<br>
foo()</li>
  </ul>
</ol>
As far as I understand, case 1 yields a topic map with one topic with
<a class="moz-txt-link-rfc2396E" href="http://bar/3/some_topic">"http://bar/3/some_topic"</a> as identifier. Does case 2 yield a topic map
with one topic with <a class="moz-txt-link-rfc2396E" href="http://bar/3/some_topic">"http://bar/3/some_topic"</a> as identifier, too?<br>
<br>
Then, how about this example?<br>
<br>
<ol>
  <li>case 1</li>
  <ul>
    <li>file1.ctm:<br>
%prefix foo <a class="moz-txt-link-freetext" href="http://bar/1/">http://bar/1/</a></li>
    <li>file2.ctm:<br>
%prefix foo <a class="moz-txt-link-freetext" href="http://bar/2/">http://bar/2/</a></li>
    <li>file3.ctm:<br>
%include file1.ctm<br>
%include file2.ctm<br>
foo:some_topic</li>
  </ul>
  <li>case 2<br>
  </li>
  <ul>
    <li>file1.ctm:<br>
def foo() <a class="moz-txt-link-freetext" href="http://bar1/some_topic">http://bar1/some_topic</a> end</li>
    <li>file2.ctm:<br>
def foo() <a class="moz-txt-link-freetext" href="http://bar2/some_topic">http://bar2/some_topic</a> end</li>
    <li>file3.ctm:<br>
%include file1.ctm<br>
%include file2.ctm<br>
foo()</li>
  </ul>
</ol>
Does case 1 yield an error? Does case 2 yield an error?<br>
<br>
I think that name clashes should be treated equally, regardless whether
it is a prefix name clash or a template name clash.<br>
<br>
I'd opt for the following:<br>
<ul>
  <li>In general, names are propagated up from included files into the
namespace of the including file.</li>
  <li>If the same name is redefined in the including file, then this
name takes precedence for that file</li>
  <li>If two names clash (e.g. in file3.ctm), then</li>
  <ul>
    <li>the names are retained if their content is the same (for
prefixes, if the URL they point to is the same, for templates, if their
execution would be the same, more specifically if their (string)
content and scope (e.g. what prefixes are valid for them) are the same)</li>
    <li>the names cancel each other out if their content is different.
This means that the name is treated at the including file as if it is
not defined. (This means: If the name is dereferenced, there is an
error (but maybe a more specific error message saying that there have
been candidates, but they are ambiguous). If the name is defined in the
including, then it is overridden.)</li>
  </ul>
</ul>
This suggestion also solves the following use case:<br>
<br>
<ul>
  <li>file0.ctm:<br>
def foo($param) ... end</li>
  <li>file1.ctm:<br>
%include file0.ctm<br>
foo(...)</li>
  <li>file2.ctm:<br>
%include file0.ctm<br>
foo(...)</li>
  <li>file3.ctm:<br>
%include file1.ctm<br>
%include file2.ctm<br>
foo()</li>
</ul>
Currently, after "%include file2.ctm", the CTM parser creates an error
because template "foo" is doubly-defined. This defeats the purpose of
templates and including: to centralize common templates or common
patterns into a central file ("file0.ctm" in this case).<br>
<br>
ciao,<br>
Xu&acirc;n.<br>
<br>
</body>
</html>