Sandboxed Dictionaries

This implements some words to create a sandboxed dictionary and to execute a word or quotation within the sandbox.

Making A Sandboxed Dictionary

The dictionary is structured as a linked list. To make a new one, I take an array with the names from the global dictionary, extract the header fields for each, and make a new list using them.

The make-dict will return a pointer to the last entry in the new dictionary.

~~~{{   'D var   :unpack (d-saa)     d:lookup [ d:name ] [ d:class fetch ] [ d:xt fetch ] tri ;   :add-header (saa-)     here [ @D , , , s, ] dip !D  ; ---reveal---   :make-dict (a-a)     #0 !D [ unpack add-header ] a:for-each @D ; }} ~~~

The { ... } make-dict can be wrapped in something to make this a little more obvious.

~~~  :dict{ (-)  |{ ; immediate   :}dict (-a) |} |make-dict ; immediate ~~~

Using The Sandboxed Dictionary

I implement a very simple d:with to run a quote with a sandboxed dictionary. This works by temporarily replacing the global dictionary with the sandboxed one.

~~~:d:with (qa-)   &Dictionary [ !Dictionary call ] v:preserve ; ~~~

A Test Case

This will expose a dictionary with just two words that can be used with a new % sigil.

```{{   :swap $A ;   :dup $B ;   dict{ 'swap 'dup }dict 'SANDBOX const ---reveal---   :sigil:% (s) [ s:evaluate c:put ] SANDBOX d:with ; }}   #70 dup swap %swap %dup n:put n:put nl bye ```