From ce91454df11b8892f02d00d719bc469a3aba98bf Mon Sep 17 00:00:00 2001 From: crc Date: Tue, 10 Aug 2021 16:09:58 +0000 Subject: [PATCH] add in a "d:source" field to the dictionary header FossilOrigin-Name: d6c27c49b054c022fad6d2898d173f0a2705925a97bb139c1c6fbdb48f896da7 --- doc/Glossary-Concise.txt | 3 + doc/Glossary-Names-and-Stack.txt | 1 + doc/Glossary.html | 7 + doc/Glossary.txt | 11 + doc/RETRO-Book.md | 3 +- doc/book/techniques/dictionary | 3 +- doc/html/chapters/techniques/dictionary.html | 3 +- doc/words.tsv | 1 + image/retro.muri | 101 +- ngaImage | Bin 40168 -> 41588 bytes tools/retro-extend.c | 2 +- tools/retro-extend.py | 4 +- vm/nga-c-native-x86/image.c | 1268 +++++++-------- vm/nga-c/image.c | 1478 +++++++++--------- vm/nga-c/retro-compiler.c | 2 +- vm/nga-csharp/retro.cs | 2 +- vm/nga-js/nga.js | 2 +- vm/nga-nim/retro.nim | 2 +- vm/nga-pascal/bridge.pas | 2 +- vm/nga-swift/main.swift | 2 +- 20 files changed, 1527 insertions(+), 1370 deletions(-) diff --git a/doc/Glossary-Concise.txt b/doc/Glossary-Concise.txt index ee3e98d..601528b 100644 --- a/doc/Glossary-Concise.txt +++ b/doc/Glossary-Concise.txt @@ -571,6 +571,9 @@ Lookup the specified address in the dictionary and return a pointer to its dicti d:name D: d-s A: - F: - Given a dictionary header, return the name field. +d:source D: d-a A: - F: - +Given a dictionary header, return the source field. + d:words D: - A: - F: - Display a list of all named items in the `Dictionary`. diff --git a/doc/Glossary-Names-and-Stack.txt b/doc/Glossary-Names-and-Stack.txt index e39d641..aefec24 100644 --- a/doc/Glossary-Names-and-Stack.txt +++ b/doc/Glossary-Names-and-Stack.txt @@ -189,6 +189,7 @@ d:link D: d-a A: - F: - d:lookup D: s-d A: - F: - d:lookup-xt D: a-d A: - F: - d:name D: d-s A: - F: - +d:source D: d-a A: - F: - d:words D: - A: - F: - d:words-beginning-with D: s- A: - F: - d:words-with D: s- A: - F: - diff --git a/doc/Glossary.html b/doc/Glossary.html index a53933e..50e4729 100644 --- a/doc/Glossary.html +++ b/doc/Glossary.html @@ -1414,6 +1414,13 @@

Given a dictionary header, return the name field.

Class: class:word
Namespace: d
Interface Layer: all

+

d:source

+

Data: d-a
+Addr: -
+Float: -

+
+

Given a dictionary header, return the source field.

+
Class: class:word
Namespace: d
Interface Layer: all

d:words

Data: -
Addr: -
diff --git a/doc/Glossary.txt b/doc/Glossary.txt index 97f8d42..e7767cc 100644 --- a/doc/Glossary.txt +++ b/doc/Glossary.txt @@ -2191,6 +2191,17 @@ Given a dictionary header, return the name field. Class: class:word | Namespace: d | Interface Layer: all ------------------------------------------------------------------------ +d:source + + Data: d-a + Addr: - + Float: - + +Given a dictionary header, return the source field. + +Class: class:word | Namespace: d | Interface Layer: all +------------------------------------------------------------------------ + d:words Data: - diff --git a/doc/RETRO-Book.md b/doc/RETRO-Book.md index 625fbd5..cddbfbe 100644 --- a/doc/RETRO-Book.md +++ b/doc/RETRO-Book.md @@ -1780,7 +1780,8 @@ Each entry follows the following structure: 0000 Link to Prior Header 0001 Link to XT 0002 Link to Class Handler - 0003+ Word name (null terminated) + 0003 Source Identifier + 0004+ Word name (null terminated) RETRO provides words for accessing the fields in a portable manner. It's recommended to use these to allow for future diff --git a/doc/book/techniques/dictionary b/doc/book/techniques/dictionary index e4747e2..da14cb8 100644 --- a/doc/book/techniques/dictionary +++ b/doc/book/techniques/dictionary @@ -21,7 +21,8 @@ Each entry follows the following structure: 0000 Link to Prior Header 0001 Link to XT 0002 Link to Class Handler - 0003+ Word name (null terminated) + 0003 Source Identifier + 0004+ Word name (null terminated) RETRO provides words for accessing the fields in a portable manner. It's recommended to use these to allow for future diff --git a/doc/html/chapters/techniques/dictionary.html b/doc/html/chapters/techniques/dictionary.html index c827a79..5acc0bb 100644 --- a/doc/html/chapters/techniques/dictionary.html +++ b/doc/html/chapters/techniques/dictionary.html @@ -66,7 +66,8 @@ Each entry follows the following structure: 0000     Link to Prior Header 0001     Link to XT 0002     Link to Class Handler -0003+    Word name (null terminated) +0003     Source Identifier +0004+    Word name (null terminated)

RETRO provides words for accessing the fields in a portable manner. It's recommended to use these to allow for future diff --git a/doc/words.tsv b/doc/words.tsv index dfc7072..260bd33 100644 --- a/doc/words.tsv +++ b/doc/words.tsv @@ -189,6 +189,7 @@ d:link d-a - - Given a dictionary header, return the link field. class:word {n d:lookup s-d - - Lookup the specified name in the dictionary and return a pointer to its dictionary header. This returns zero if the word is not found. This also sets an internal variable ('which' in retro.muri) to the header address. class:word {n/a} {n/a} d all d:lookup-xt a-d - - Lookup the specified address in the dictionary and return a pointer to its dictionary header. This returns zero if the word is not found. class:word {n/a} {n/a} d all d:name d-s - - Given a dictionary header, return the name field. class:word {n/a} {n/a} d all +d:source d-a - - Given a dictionary header, return the source field. class:word {n/a} {n/a} d all d:words - - - Display a list of all named items in the `Dictionary`. class:word {n/a} {n/a} d rre d:words-beginning-with s- - - Display a list of all named items in the `Dictionary` that begin with the provided substring. class:word {n/a} {n/a} d rre d:words-with s- - - Display a list of all named items in the `Dictionary` that contain the provided substring. class:word {n/a} {n/a} d rre diff --git a/image/retro.muri b/image/retro.muri index 7766f2b..a42bd4f 100644 --- a/image/retro.muri +++ b/image/retro.muri @@ -685,12 +685,13 @@ RETRO has a single dictionary consisting of a linked list of headers. The current form of a header is shown in the chart below. -| field | holds | accessor | -| ----- | ---------------------------------- | -------- | -| link | link to the previous entry | d:link | -| xt | link to start of the function | d:xt | -| class | link to the class handler function | d:class | -| name | zero terminated string | d:name | +| field | holds | accessor | +| ------ | ---------------------------------- | -------- | +| link | link to the previous entry | d:link | +| xt | link to start of the function | d:xt | +| class | link to the class handler function | d:class | +| source | source identifier | d:source | +| name | zero terminated string | d:name | The initial dictionary is constructed at the end of this file. It'll take a form like this: @@ -699,25 +700,29 @@ It'll take a form like this: d 0 r _dup r class:primitive + d 0 s dup : 0001 r 0000 r _drop r class:primitive + d 0 s drop : 0002 r 0001 r _swap r class:primitive + d 0 s swap Each entry starts with a pointer to the prior entry (with a pointer to zero marking the first entry in the dictionary), a pointer to the start of the function, a pointer to the class -handler, and a null terminated string indicating the name -exposed to the RETRO interpreter. +handler, a value indicating the source of the entry, and a null +terminated string indicating the name exposed to the RETRO +interpreter. RETRO stores the pointer to the most recent entry in a variable called `Dictionary`. For simplicity, I just assign the last @@ -740,9 +745,13 @@ d 1 i liadre.. d 2 -: d:name +: d:source i liadre.. d 3 + +: d:name +i liadre.. +d 4 ~~~ A traditional Forth has `create` to make a new dictionary entry @@ -771,6 +780,9 @@ i lica.... r comma i lica.... r comma +i lilica.. +d 0 +r comma i lica.... r comma:string i polistre @@ -1510,316 +1522,385 @@ or remove new functions in the kernel. d 0 r _dup r class:primitive +d 0 s dup : 0001 r 0000 r _drop r class:primitive +d 0 s drop : 0002 r 0001 r _swap r class:primitive +d 0 s swap : 0003 r 0002 r _call r class:primitive +d 0 s call : 0004 r 0003 r _eq r class:primitive +d 0 s eq? : 0005 r 0004 r _neq r class:primitive +d 0 s -eq? : 0006 r 0005 r _lt r class:primitive +d 0 s lt? : 0007 r 0006 r _gt r class:primitive +d 0 s gt? : 0008 r 0007 r _fetch r class:primitive +d 0 s fetch : 0009 r 0008 r _store r class:primitive +d 0 s store : 0010 r 0009 r _add r class:primitive +d 0 s + : 0011 r 0010 r _sub r class:primitive +d 0 s - : 0012 r 0011 r _mul r class:primitive +d 0 s * : 0013 r 0012 r _divmod r class:primitive +d 0 s /mod : 0014 r 0013 r _and r class:primitive +d 0 s and : 0015 r 0014 r _or r class:primitive +d 0 s or : 0016 r 0015 r _xor r class:primitive +d 0 s xor : 0017 r 0016 r _shift r class:primitive +d 0 s shift : 0018 r 0017 r push r class:macro +d 0 s push : 0019 r 0018 r pop r class:macro +d 0 s pop : 0020 r 0019 r 0; r class:macro +d 0 s 0; : 0021 r 0020 r fetch-next r class:word +d 0 s fetch-next : 0022 r 0021 r store-next r class:word +d 0 s store-next : 0023 r 0022 r s:to-number r class:word +d 0 s s:to-number : 0024 r 0023 r s:eq r class:word +d 0 s s:eq? : 0025 r 0024 r s:length r class:word +d 0 s s:length : 0026 r 0025 r choose r class:word +d 0 s choose : 0027 r 0026 r if r class:primitive +d 0 s if : 0028 r 0027 r -if r class:word +d 0 s -if : 0029 r 0028 r sigil:( r class:macro +d 0 s sigil:( : 0030 r 0029 r Compiler r class:data +d 0 s Compiler : 0031 r 0030 r Heap r class:data +d 0 s Heap : 0032 r 0031 r comma r class:word +d 0 s , : 0033 r 0032 r comma:string r class:word +d 0 s s, : 0034 r 0033 r ; r class:macro +d 0 s ; : 0035 r 0034 r [ r class:macro +d 0 s [ : 0036 r 0035 r ] r class:macro +d 0 s ] : 0037 r 0036 r Dictionary r class:data +d 0 s Dictionary : 0038 r 0037 r d:link r class:word +d 0 s d:link : 0039 r 0038 r d:xt r class:word +d 0 s d:xt : 0040 r 0039 r d:class r class:word +d 0 s d:class : 0041 r 0040 r d:name r class:word +d 0 s d:name : 0042 r 0041 r class:word r class:word +d 0 s class:word : 0043 r 0042 r class:macro r class:word +d 0 s class:macro : 0044 r 0043 r class:data r class:word +d 0 s class:data : 0045 r 0044 r d:add-header r class:word +d 0 s d:add-header : 0046 r 0045 r sigil:# r class:macro +d 0 s sigil:# : 0047 r 0046 r sigil:: r class:macro +d 0 s sigil:: : 0048 r 0047 r sigil:& r class:macro +d 0 s sigil:& : 0049 r 0048 r sigil:$ r class:macro +d 0 s sigil:$ : 0050 r 0049 r repeat r class:macro +d 0 s repeat : 0051 r 0050 r again r class:macro +d 0 s again : 0052 r 0051 r interpret r class:word +d 0 s interpret : 0053 r 0052 r d:lookup r class:word +d 0 s d:lookup : 0054 r 0053 r class:primitive r class:word +d 0 s class:primitive : 0055 r 0054 r Version r class:data +d 0 s Version : 0056 r 0055 r muri:i r class:word +d 0 s i : 0057 r 0056 r comma r class:word +d 0 s d : 0058 r 0057 r muri:r r class:word +d 0 s r : 0059 r 0058 r Base r class:data +d 0 s Base : 0060 r 0059 r pack r class:word +d 0 s pack : 0061 r 0060 r unpack r class:word +d 0 s unpack -: 9999 +: 0062 r 0061 +r d:source +r class:word +d 0 +s d:source +: 9999 +r 0062 r err:notfound r class:word +d 0 s err:notfound ~~~ diff --git a/ngaImage b/ngaImage index 70826caa726c01ec0522da7340261972febaddce..3ab9f1ca4cd0e4cb48f133e3c2ab73fb06f8da1b 100644 GIT binary patch literal 41588 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