Author: chip
Date: Sun Apr 16 21:21:53 2006
New Revision: 12284

Modified:
   trunk/docs/pdds/pdd21_namespaces.pod

Log:
* Documented clearly & consistently that all namespace opcodes start their
  search in the HLL root namespace, *not* at the global root.

* Added a second namespace method to the compiler API:

    get_namespace(["namespace", "elements", ...])

  <puzzlement> I'm still not sure how we ended up with methods on compilers
  to support namespace operations, but either somebody did it and I have a
  bad memory, or I did it and I have a *really* bad memory.  Seems like a
  workable idea though. </puzzlement>

* Amended docs to consistently include second parameter to compiler method:

    load_library(["namespace", ...], control)

* Fixed PIR translation of sample Perl 6 code importing from Tcl.


Modified: trunk/docs/pdds/pdd21_namespaces.pod
==============================================================================
--- trunk/docs/pdds/pdd21_namespaces.pod        (original)
+++ trunk/docs/pdds/pdd21_namespaces.pod        Sun Apr 16 21:21:53 2006
@@ -88,7 +88,7 @@
 =item True Root Namespace
 
 The true root namespace is available only via introspection with the
-C<interpinfo> opcode, e.g. C<$P0 = interpinfo .NAMESPACE_ROOT>.
+C<interpinfo> opcode, e.g. C<$P0 = interpinfo .INTERPINFO_NAMESPACE_ROOT>.
 
 =item HLL Implementation Namespaces
 
@@ -245,6 +245,23 @@
 
 =over 4
 
+=item get_namespace($P0)
+
+Ask this compiler to find its namespace named by the elements of the array in
+$P0.  Returns namespace PMC on success and null PMC on failure.  Note that a
+null PMC or an empty array requests the HLL's base namespace.
+
+This method allows other HLLs to know one name (the HLL) and then work with
+that HLL's modules without having to know the name it chose for its namespace
+tree.  (If you really want to know the name, the name() method should work on
+the returned namespace PMC.)
+
+Note that this method is basically a convenience and/or performance hack, as
+it does the equivalent of C<interpinfo .INTERPINFO_NAMESPACE_ROOT> followed by
+zero or more calls to <namespace>.find_namespace().  However, any compiler is
+free to cheat if it doesn't get caught, e.g. to use the untyped namespace
+interface if the language doesn't mangle namespace names.
+
 =item load_library($P0, $P1)
 
 Ask this compiler to load a library/module named by the elements of the array
@@ -280,6 +297,10 @@
 
 =head2 Namespace Opcodes
 
+Note that all namespace opcodes operate from the local HLL root namespace.
+Navigating outside one's own HLL namespace requires either the C<interpinfo
+.INTERPINFO_NAMESPACE_ROOT> opcode or the get_namespace() compiler PMC method.
+
 =over 4
 
 =item add_namespace $P0, $P1
@@ -433,12 +454,15 @@
 
   .sub main :main
     $P0 = find_name "&foo"
-    $P1 = get_namespace ["perl6"; "Foo"]
+    $P1 = get_namespace ["Foo"]
+
     # A smart perl6 compiler would emit this,
     # because it knows that Foo is a perl6 namespace:
-    #   $P1["&bar"] = $P0
-    # But a naive one would emit this:
+    $P1["&bar"] = $P0
+
+    # But a naive perl6 compiler would emit this:
     $P1.add_sub("bar", $P0)
+
     end
   .end
 
@@ -454,16 +478,22 @@
   use tcl:Some::Module 'w*';   # XXX - is ':' after HLL standard Perl 6?
   write("this is a tcl command");
 
-PIR:
+PIR (without error checking):
 
   .sub main :main
     .local pmc tcl
+    .local pmc ns
     tcl = compreg "tcl"
-    tcl.load_library("Some", "Module")
-    $P0 = get_namespace
-    $P1 = get_namespace ["tcl"; "Some"; "Module"]
-    $P1.export_to($P0, 'w*')
-    write("this is a tcl command")
+    ns = new .Array
+    ns = 2
+    ns[0] = "Some"
+    ns[1] = "Module"
+    null $P0
+    tcl.load_library(ns, $P0)
+    $P0 = tcl.get_namespace(ns)
+    $P1 = get_namespace
+    $P0.export_to($P1, 'w*')
+    "write"("this is a tcl command")
     end
   .end
 

Reply via email to