       { [ dup lisp-symbol? ] [ '[ , lookup-var ] ] }
      [ 1quotation ]
     } cond ;
-    
+
 : lisp-string>factor ( str -- quot )
     lisp-expr compile-form ;
     
 : lisp-eval ( str -- * )    
-  lisp-string>factor call ;
-    
+    lisp-string>factor call ;
+
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 SYMBOL: lisp-env
 SYMBOL: macro-env
-    
+
 ERROR: no-such-var variable-name ;
 M: no-such-var summary drop "No such variable" ;
 


: lisp-define ( quot name -- )
    lisp-env get set-at ;
    
: defun ( name quot -- name )    
    over name>> lisp-define ;
    
: lisp-get ( name -- word )
    lisp-env get at ;
    
: lookup-var ( lisp-symbol -- quot )
    [ name>> ] [ lisp-var? ] bi [ lisp-get ] [ no-such-var ] if ;
    
: lisp-var? ( lisp-symbol -- ? )
    dup lisp-symbol? [ name>> lisp-env get key? ] [ drop f ] if ;
    
: funcall ( quot sym -- * )
    [ 1array [ call ] with-datastack >quotation ] dip
    dup lisp-symbol? [ lookup-var ] when curry call ; inline
    
: define-primitive ( name vocab word -- )  
    swap lookup 1quotation '[ , compose call ] swap lisp-define ;
    
: lookup-macro ( lisp-symbol -- lambda )
    name>> macro-env get at ;
    
: define-lisp-macro ( quot name -- )
    macro-env get set-at ;
    
: lisp-macro? ( car -- ? )
    dup lisp-symbol? [ name>> macro-env get key? ] [ drop f ] if ;

      { "cond" [ convert-cond ] }
     [ drop convert-general-form ]
    } case ;

: convert-list-form ( cons -- quot )
    dup car
    { { [ dup lisp-macro?  ] [ drop macro-expand ] }
      { [ dup lisp-symbol? ] [ form-dispatch ] }
     [ drop convert-general-form ]
    } cond ;

: convert-form ( lisp-form -- quot )
    {
      { [ dup cons? ] [ convert-list-form ] }
