]> code.bitgloo.com Git - bitgloo/alee-forth.git/commitdiff
add more core.fth words
authorClyne Sullivan <clyne@bitgloo.com>
Thu, 9 Feb 2023 23:20:35 +0000 (18:20 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Thu, 9 Feb 2023 23:20:35 +0000 (18:20 -0500)
alee.cpp
core.fth
dictionary.hpp
parser.cpp

index 1232aa6173d6bd0e6d23b7df060b4078f8c53edc..f87831fb16e6d2e86665269b4d7df8cc7a9625fa 100644 (file)
--- a/alee.cpp
+++ b/alee.cpp
@@ -50,6 +50,9 @@ int user_sys(State& state)
     case 0:
         std::cout << state.pop() << std::endl;
         break;
+    case 1:
+        std::cout << static_cast<char>(state.pop()) << std::endl;
+        break;
     }
 
     return 0;
@@ -63,7 +66,7 @@ void parseLine(Parser& parser, State& state, std::string_view line)
     } while (r == ParseStatus::Continue);
 
     if (r != ParseStatus::Finished)
-        std::cout << "r " << to_string(r) << std::endl;
+        std::cout << to_string(r) << ": " << line << std::endl;
 }
 
 void parseFile(Parser& parser, State& state, std::istream& file)
index ab53923cd6d7ff0365cf16e25691633bdbf14141..555b126b5a88c69e757bdc783350844d3f0a2b31 100644 (file)
--- a/core.fth
+++ b/core.fth
@@ -1,15 +1,48 @@
 ( : variable create 0 , ; )
 ( : create here const ; )
 
-: . 0 sys ;
+( set decimal numbers )
+10 0 !
+
+: .      0 sys ;
+: emit   1 sys ;
 
 : over   1 pick ;
 : -rot   rot rot ;
 : nip    swap drop ;
 : tuck   swap over ;
 
+: +!     swap over @ + swap ! ;
+
 : 1+ 1 + ;
 : 1- 1 - ;
 
 : 0= 0 = ;
 : >= < 0= ;
+
+: 2drop  drop drop ;
+: 2dup   over over ;
+: 2over  3 pick 3 pick ;
+: 2swap  rot >r rot r> ;
+
+: and    & ;
+: or     | ;
+: xor    ^ ;
+: lshift << ;
+: rshift >> ;
+
+: ,      here ! 1 allot ;
+: c!     ! ;
+: c,     , ;
+: c@     @ ;
+: cell+  1+ ;
+: cells  ;
+: char+  1+ ;
+: chars  ;
+
+: cr 9 emit ;
+: bl 32 ;
+
+: base    0 ;
+: decimal 1 2* base ! 1010 base ! ;
+
index add7fc3c8c5646f39b89b818ce302dcd3011efbb..2a54a5d3b6431c24279873ca191ec7a275c59468 100644 (file)
@@ -27,7 +27,7 @@
 class Dictionary
 {
 public:
-    Addr here = 1;
+    Addr here = 1; // address zero will be used for BASE.
     Addr latest = 0;
 
     virtual Cell read(Addr) const = 0;
index d57365bf05b1cb6f6f7961fb717348d386a57ee6..99cbc8b46b03df46bdabb675cc8a3b1842aa8819 100644 (file)
@@ -77,7 +77,8 @@ ParseStatus Parser::parse(State& state, std::string_view& str)
             }
         } else {
             char *p;
-            const auto l = static_cast<Cell>(std::strtol(sub.data(), &p, 10));
+            const auto base = state.dict.read(0);
+            const auto l = static_cast<Cell>(std::strtol(sub.data(), &p, base));
 
             if (p != sub.data()) {
                 if (state.compiling) {