Relaxed symbol parsing rules.
[scheme.forth.jl.git] / scheme.4th
index 5ea44ee..6d56d64 100644 (file)
@@ -18,7 +18,7 @@ include defer-is.4th
 
 \ ------ Memory ------
 
-100 constant N
+1000 constant N
 create car-cells N allot
 create car-type-cells N allot
 create cdr-cells N allot
@@ -50,6 +50,11 @@ variable nextfree
     cdr-type-cells + @
 ;
 
+: caar car car ;
+: cadr cdr car ;
+: cdar car cdr ;
+: cddr cdr cdr ;
+
 : nil 0 nil-type ;
 : nil? nil-type istype? ;
 
@@ -65,6 +70,42 @@ variable nextfree
 objvar symbol-table
 nil symbol-table setobj
 
+: objeq? ( obj obj -- bool )
+    rot = -rot = and ;
+
+\ ---- Pre-defined symbols ----
+
+: (create-symbol) ( addr n -- symbol-obj )
+    dup 0= if
+        2drop nil
+    else
+        2dup drop @ character-type 2swap
+        swap 1+ swap 1-
+        recurse
+
+        cons
+    then
+;
+
+: create-symbol ( -- )
+    bl word
+    count
+
+    (create-symbol)
+    drop symbol-type
+
+    2dup
+
+    symbol-table fetchobj
+    cons
+    symbol-table setobj
+
+    create swap , ,
+    does> dup @ swap 1+ @
+;
+
+create-symbol quote quote
+
 \ ---- Read ----
 
 variable parse-idx
@@ -234,30 +275,6 @@ parse-idx-stack parse-idx-sp !
 : string? ( -- bool )
     nextchar [char] " = ;
 
-: initial? ( -- bool )
-    nextchar [char] A >= nextchar [char] Z <= and if true exit then
-    nextchar [char] a >= nextchar [char] z <= and if true exit then
-    nextchar [char] * = if true exit then
-    nextchar [char] / = if true exit then
-    nextchar [char] > = if true exit then
-    nextchar [char] < = if true exit then
-    nextchar [char] = = if true exit then
-    nextchar [char] ? = if true exit then
-    nextchar [char] ! = if true exit then
-    false
-;
-
-: symbol? ( -- bool )
-    initial? if true exit then
-    nextchar [char] + =
-    nextchar [char] - = or if
-        inc-parse-idx
-        delim? if dec-parse-idx true exit then
-        dec-parse-idx
-    then
-    false
-;
-
 : readnum ( -- num-atom )
     minus? dup if
         inc-parse-idx
@@ -476,11 +493,6 @@ defer read
         exit
     then
 
-    symbol? if
-        readsymbol charlist>symbol
-        exit
-    then
-
     pair? if
         inc-parse-idx
 
@@ -500,29 +512,57 @@ defer read
         exit
     then
 
+    nextchar [char] ' = if
+        inc-parse-idx
+        quote recurse nil cons cons exit
+    then
+
     eof? if
         bold fg blue ." Moriturus te saluto." reset-term ."  ok" cr
         quit
     then
 
-    bold fg red ." Error parsing string starting at character '"
-    nextchar emit
-    ." '. Aborting." reset-term cr
-    abort
+    \ Anything else is assumed to be a symbol
+    readsymbol charlist>symbol
 
 ; is read
 
 \ ---- Eval ----
 
 : self-evaluating? ( obj -- obj bool )
-    true \ everything self-evaluating for now
+    boolean-type istype? if true exit then
+    number-type istype? if true exit then
+    character-type istype? if true exit then
+    string-type istype? if true exit then
+    nil-type istype? if true exit then
+
+    false
 ;
 
+: tagged-list? ( obj tag-obj -- obj bool )
+    2over 
+    pair-type istype? false = if
+        2drop 2drop false
+    else
+        car objeq?
+    then ;
+
+: quote? ( obj -- obj bool )
+    quote tagged-list?  ;
+
+: quote-body ( quote-obj -- quote-body-obj )
+    cadr ;
+    
 : eval
     self-evaluating? if
         exit
     then
 
+    quote? if
+        quote-body
+        exit
+    then
+
     bold fg red ." Error evaluating expression - unrecognized type. Aborting." reset-term cr
     abort
 ;