> The intention behind the code (see below) is pretty simple. (mk) will
> create a new namespace (well, a new symbol table), and (dset) should
> set a variable in a specified namespace.
For one thing, you can easily set a variable in another namespace with:
(setq Dc~k1 123)
This works, btw, also with further indirections:
(setq Dc~ns1~ns2~k1 777)
> + even though (dset) switches the active symbol table with (symbols Dict-ns)
> + and (symbols) returns <Dict-ns> as the active symbol table
> + but the variable |Key| is still only set in the pico symbol table
You must keep in mind that namespaces affect only the reader, not
expressions which already have been read. The namespace which is active
at the moment an expression is read determines which symbol with a given
name will be in the expression.
> 1) What am I doing wrong when I'm trying to (setq) the variable?
> (mk Dc)
creates a new namespace 'Dc', and immidiately sets the current namespace
back to 'pico'. That's all right. The expression
> (dset Dc k1 (pack (time) " elapsed seconds"))
is _read_ while 'pico' is the active namespace. A symbol 'k1' didn't
exist at the moment the above 'mk' was called, so an entry for that name
will be created in 'pico', and the expression '(setq Dc ...)' is
returned, and then evaluated. It is irrelevant what 'dset' does with its
arguments during that evaluation, the symbol 'k1' exists in 'pico'.
> 2) is there a way to create a new symbol-table/namespace without it
> becoming the active one?
Yes. The above 'mk' is fine for that.
> 3) is there a way to check if a symbol is interned, without actually
> interning it and setting it to NIL (if it didn't previously exist).
> Basically, some way to do (interned? 'sym) => T/NIL .
Yes, but I can't think of a peculiarly efficient way at the moment. You
could check with
(member "foo" (all))
i.e. use a transient symbol to avoid the interning.
Technically, an efficient way would be possible (avoiding 'all', which
first collects all symbols into a list), by indexing directly into the
name tree. There is even such a function in the interpreter, i.e.
'isInternEXY_F' in src64/sym.l:37, but unfortunately there is no
top-level frontend for it.
Where would such a function be useful?
> 4) is there a way to concatenate two symbol-names together, without
> creating a transient symbol? (symbol+ 'foo 'bar) => 'foobar
No, but creating a transient symbol first does no harm. A transient
symbol is just a symbol which happens not to be referred to from the
current namespace. Each internal symbol is first created (by the reader)
as a transient symbol, and then immediately interned.
So (pack "foo" "bar") and (pack 'foo 'bar) both return "foobar", and
(intern (pack "foo" "bar")) is just fine.