From 0c10c13e4d315f70ca72cce99ca7d3ff8e0b6b22 Mon Sep 17 00:00:00 2001
From: James Cash <james.nvc@gmail.com>
Date: Sat, 26 Apr 2008 17:20:12 -0400
Subject: [PATCH] Bug fixes

---
 extra/lisp/lisp.factor | 66 +++++++++++++-----------------------------
 1 file changed, 20 insertions(+), 46 deletions(-)

diff --git a/extra/lisp/lisp.factor b/extra/lisp/lisp.factor
index 624f190fb1..729c136a95 100644
--- a/extra/lisp/lisp.factor
+++ b/extra/lisp/lisp.factor
@@ -1,53 +1,24 @@
 ! Copyright (C) 2008 James Cash
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel peg.ebnf peg.expr math.parser sequences arrays strings combinators.lib
-namespaces combinators math bake locals.private accessors vectors syntax ;
+USING: kernel peg sequences arrays strings combinators.lib
+namespaces combinators math bake locals.private accessors vectors syntax lisp.parser ;
 IN: lisp
 
-TUPLE: lisp-symbol name ;
-
-C: <lisp-symbol> lisp-symbol
-
-EBNF: lisp-expr
-_            = (" " | "\t" | "\n")*
-LPAREN       = "("
-RPAREN       = ")"
-dquote       = '"'
-digit        = [0-9]
-integer      = (digit)+                               => [[ string>number ]]
-float        = (digit)+ "." (digit)*                  => [[ first3 >string [ >string ] dipd 3append string>number ]]
-number       = float
-              | integer
-id-specials  = "!" | "$" | "%" | "&" | "*" | "/" | ":" | "<"
-              | " =" | ">" | "?" | "^" | "_" | "~" | "+" | "-" | "." | "@"
-letters      = [a-zA-Z]                               => [[ 1array >string ]]
-initials     = letters | id-specials
-numbers      = [0-9]                                  => [[ 1array >string ]]
-subsequents  = initials | numbers
-identifier   = initials (subsequents)*                => [[ first2 concat append <lisp-symbol> ]]
-string       = dquote ("\" . | !(dquote) . )*  dquote => [[ second >string ]]
-atom         = number
-              | identifier
-              | string
-list-item    = _ (atom|list) _                        => [[ second ]]
-list         = LPAREN (list-item)* RPAREN             => [[ second ]]
-;EBNF
-
 DEFER: convert-form
 
-: convert-body ( lisp-form -- quot )
+: convert-body ( s-exp -- quot )
   [ convert-form ] map [ ] [ compose ] reduce ; inline
   
-: convert-if ( lisp-form -- quot )
+: convert-if ( s-exp -- quot )
   1 tail [ convert-form ] map reverse first3  [ % , , if ] bake ;
   
-: convert-begin ( lisp-form -- quot )  
+: convert-begin ( s-exp -- quot )  
   1 tail convert-body ;
   
-: convert-cond ( lisp-form -- quot )  
+: convert-cond ( s-exp -- quot )  
   1 tail [ [ convert-body map ] map ] [ % cond ] bake ;
   
-: convert-general-form ( lisp-form -- quot )  
+: convert-general-form ( s-exp -- quot )  
   unclip swap convert-body [ % , ] bake ;
   
 <PRIVATE  
@@ -56,20 +27,23 @@ DEFER: convert-form
                      [ dup vector? [ localize-body ] [ nip ] if ] if ] with map ; inline
 PRIVATE>                     
   
-: convert-lambda ( lisp-form -- quot )  
+: convert-lambda ( s-exp -- quot )  
   1 tail unclip reverse [ name>> ] map dup make-locals dup push-locals
   [ swap localize-body convert-body ] dipd pop-locals swap <lambda> ;
   
-: convert-list-form ( lisp-form -- quot )  
-dup first dup lisp-symbol? [ name>>
-  { { "lambda" [ convert-lambda ] }
-    { "if" [ convert-if ] }
-    { "begin" [ convert-begin ] }
-    { "cond" [ convert-cond ] }
-   [ drop convert-general-form ]
-  } case ] [ drop convert-general-form ] if ;
+: convert-list-form ( s-exp -- quot )  
+  dup first dup lisp-symbol? [ name>>
+      { { "lambda" [ convert-lambda ] }
+        { "if" [ convert-if ] }
+        { "begin" [ convert-begin ] }
+        { "cond" [ convert-cond ] }
+       [ drop convert-general-form ]
+     } case ] [ drop convert-general-form ] if ;
   
 : convert-form ( lisp-form -- quot )
   { { [ dup vector? ] [ convert-list-form ] }
    [ [ , ] [ ] make ]
-  } cond ;
\ No newline at end of file
+  } cond ;
+  
+: lisp-string>factor ( str -- quot )  
+  lisp-expr parse-result-ast convert-form ;
\ No newline at end of file