shithub: femtolisp

Download patch

ref: 2f78b407ea3d48be3e7202fc7af2529824366d34
parent: 3844191d707395bc0611a32e8cbb109f56b5c6e2
author: JeffBezanson <jeff.bezanson@gmail.com>
date: Mon Jun 29 23:21:41 EDT 2009

some renaming (intern is now symbol) and moving stuff around
adding scheme aliases


--- /dev/null
+++ b/femtolisp/aliases.scm
@@ -1,0 +1,47 @@
+; definitions of standard scheme procedures in terms of
+; femtolisp procedures
+
+(define vector-ref aref)
+(define vector-set! aset!)
+(define vector-length length)
+(define make-vector vector.alloc)
+
+(define array-ref! aref)
+(define (array-set! a obj i0 . idxs)
+  (if (null? idxs)
+      (aset! a i0 obj)
+      (error "array-set!: multiple dimensions not yet implemented")))
+
+(define (array-dimensions a)
+  (list (length a)))
+
+(define (complex? x) #f)
+(define (real? x) (number? x))
+(define (rational? x) (integer? x))
+(define (exact? x) (integer? x))
+(define (inexact? x) (not (exact? x)))
+(define quotient div0)
+
+(define (char->integer c) (fixnum c))
+(define (integer->char i) (wchar i))
+(define char-upcase char.upcase)
+(define char-downcase char.downcase)
+(define char=? =)
+(define char<? <)
+(define char>? >)
+(define char<=? <=)
+(define char>=? >=)
+
+(define string=? =)
+(define string<? <)
+(define string>? >)
+(define string<=? <=)
+(define string>=? >=)
+(define string-copy copy)
+(define string-append string)
+(define string-length string.count)
+(define string->symbol symbol)
+(define (symbol->string s) (string s))
+
+(define (string-ref s i)
+  (string.char s (string.inc s 0 i)))
--- a/femtolisp/ast/asttools.lsp
+++ b/femtolisp/ast/asttools.lsp
@@ -2,7 +2,7 @@
 ; utilities for AST processing
 
 (define (symconcat s1 s2)
-  (intern (string s1 s2)))
+  (symbol (string s1 s2)))
 
 (define (list-adjoin item lst)
   (if (member item lst)
--- a/femtolisp/ast/rpasses.lsp
+++ b/femtolisp/ast/rpasses.lsp
@@ -21,7 +21,7 @@
 
 (let ((ctr 0))
   (set! r-gensym (lambda ()
-		   (prog1 (intern (string "%r:" ctr))
+		   (prog1 (symbol (string "%r:" ctr))
 			  (set! ctr (+ ctr 1))))))
 
 (define (dollarsign-transform e)
--- a/femtolisp/builtins.c
+++ b/femtolisp/builtins.c
@@ -130,11 +130,11 @@
     return NIL;
 }
 
-static value_t fl_intern(value_t *args, u_int32_t nargs)
+static value_t fl_symbol(value_t *args, u_int32_t nargs)
 {
-    argcount("intern", nargs, 1);
+    argcount("symbol", nargs, 1);
     if (!isstring(args[0]))
-        type_error("intern", "string", args[0]);
+        type_error("symbol", "string", args[0]);
     return symbol(cvalue_data(args[0]));
 }
 
@@ -416,7 +416,7 @@
     { "set-top-level-value!", fl_set_top_level_value },
     { "raise", fl_raise },
     { "exit", fl_exit },
-    { "intern", fl_intern },
+    { "symbol", fl_symbol },
 
     { "fixnum", fl_fixnum },
     { "truncate", fl_truncate },
--- a/femtolisp/cps.lsp
+++ b/femtolisp/cps.lsp
@@ -17,7 +17,7 @@
       (k (apply f args))))
 (define *funcall/cc-names*
   (list->vector
-   (map (lambda (i) (intern (string 'funcall/cc- i)))
+   (map (lambda (i) (symbol (string 'funcall/cc- i)))
         (iota 6))))
 (define-macro (def-funcall/cc-n args)
   (let ((name (aref *funcall/cc-names* (length args))))
--- a/femtolisp/flisp.c
+++ b/femtolisp/flisp.c
@@ -1,35 +1,29 @@
 /*
   femtoLisp
 
-  a minimal interpreter for a minimal lisp dialect
+  a compact interpreter for a minimal lisp/scheme dialect
 
-  this lisp dialect uses lexical scope and self-evaluating lambda.
-  it supports 30-bit integers, symbols, conses, and full macros.
-  it is case-sensitive.
-  it features a simple compacting copying garbage collector.
-  it uses a Scheme-style evaluation rule where any expression may appear in
-    head position as long as it evaluates to a function.
-  it uses Scheme-style varargs (dotted formal argument lists)
-  lambdas can have only 1 body expression; use (begin ...) for multiple
-    expressions. this is due to the closure representation
-    (lambda args body . env)
+  characteristics:
+  * lexical scope, lisp-1
+  * unrestricted macros
+  * data types: 30-bit integer, symbol, pair, vector, char, string, table
+      iostream, procedure, low-level data types
+  * case-sensitive
+  * simple compacting copying garbage collector
+  * Scheme-style varargs (dotted formal argument lists)
+  * "human-readable" bytecode with self-hosted compiler
 
-  This is a fully fleshed-out lisp built up from femtoLisp. It has all the
-  remaining features needed to be taken seriously:
+  extra features:
   * circular structure can be printed and read
-  * #. read macro for eval-when-read and correctly printing builtins
+  * #. read macro for eval-when-read and readably printing builtins
   * read macros for backquote
   * symbol character-escaping printer
-  * vectors
   * exceptions
   * gensyms (can be usefully read back in, too)
-  * #| multiline comments |#
+  * #| multiline comments |#, lots of other lexical syntax
   * generic compare function, cyclic equal
   * cvalues system providing C data types and a C FFI
   * constructor notation for nicely printing arbitrary values
-  * strings
-  * hash tables
-  * I/O streams
 
   by Jeff Bezanson (C) 2009
   Distributed under the BSD License
@@ -738,61 +732,6 @@
     return POP();
 }
 
-value_t fl_copylist(value_t *args, u_int32_t nargs)
-{
-    argcount("copy-list", nargs, 1);
-    return FL_COPYLIST(args[0]);
-}
-
-value_t fl_append(value_t *args, u_int32_t nargs)
-{
-    if (nargs == 0)
-        return NIL;
-    value_t first=NIL, lst, lastcons=NIL;
-    fl_gc_handle(&first);
-    fl_gc_handle(&lastcons);
-    uint32_t i=0;
-    while (1) {
-        if (i >= MAX_ARGS) {
-            lst = car_(args[MAX_ARGS]);
-            args[MAX_ARGS] = cdr_(args[MAX_ARGS]);
-            if (!iscons(args[MAX_ARGS])) break;
-        }
-        else {
-            lst = args[i++];
-            if (i >= nargs) break;
-        }
-        if (iscons(lst)) {
-            lst = FL_COPYLIST(lst);
-            if (first == NIL)
-                first = lst;
-            else
-                cdr_(lastcons) = lst;
-            lastcons = tagptr((((cons_t*)curheap)-1), TAG_CONS);
-        }
-        else if (lst != NIL) {
-            type_error("append", "cons", lst);
-        }
-    }
-    if (first == NIL)
-        first = lst;
-    else
-        cdr_(lastcons) = lst;
-    fl_free_gc_handles(2);
-    return first;
-}
-
-value_t fl_liststar(value_t *args, u_int32_t nargs)
-{
-    if (nargs == 1) return args[0];
-    else if (nargs == 0) argcount("list*", nargs, 1);
-    if (nargs > MAX_ARGS) {
-        args[MAX_ARGS] = apply_liststar(args[MAX_ARGS], 1);
-        return list(args, nargs);
-    }
-    return _list(args, nargs, 1);
-}
-
 static value_t do_trycatch()
 {
     uint32_t saveSP = SP;
@@ -1717,13 +1656,8 @@
     return maxsp+6;
 }
 
-// initialization -------------------------------------------------------------
+// builtins -------------------------------------------------------------------
 
-extern void builtins_init();
-extern void comparehash_init();
-
-static char *EXEDIR = NULL;
-
 void assign_global_builtins(builtinspec_t *b)
 {
     while (b->name != NULL) {
@@ -1784,6 +1718,61 @@
     return fn_env(v);
 }
 
+value_t fl_copylist(value_t *args, u_int32_t nargs)
+{
+    argcount("copy-list", nargs, 1);
+    return FL_COPYLIST(args[0]);
+}
+
+value_t fl_append(value_t *args, u_int32_t nargs)
+{
+    if (nargs == 0)
+        return NIL;
+    value_t first=NIL, lst, lastcons=NIL;
+    fl_gc_handle(&first);
+    fl_gc_handle(&lastcons);
+    uint32_t i=0;
+    while (1) {
+        if (i >= MAX_ARGS) {
+            lst = car_(args[MAX_ARGS]);
+            args[MAX_ARGS] = cdr_(args[MAX_ARGS]);
+            if (!iscons(args[MAX_ARGS])) break;
+        }
+        else {
+            lst = args[i++];
+            if (i >= nargs) break;
+        }
+        if (iscons(lst)) {
+            lst = FL_COPYLIST(lst);
+            if (first == NIL)
+                first = lst;
+            else
+                cdr_(lastcons) = lst;
+            lastcons = tagptr((((cons_t*)curheap)-1), TAG_CONS);
+        }
+        else if (lst != NIL) {
+            type_error("append", "cons", lst);
+        }
+    }
+    if (first == NIL)
+        first = lst;
+    else
+        cdr_(lastcons) = lst;
+    fl_free_gc_handles(2);
+    return first;
+}
+
+value_t fl_liststar(value_t *args, u_int32_t nargs)
+{
+    if (nargs == 1) return args[0];
+    else if (nargs == 0) argcount("list*", nargs, 1);
+    if (nargs > MAX_ARGS) {
+        args[MAX_ARGS] = apply_liststar(args[MAX_ARGS], 1);
+        return list(args, nargs);
+    }
+    return _list(args, nargs, 1);
+}
+
 static builtinspec_t core_builtin_info[] = {
     { "function", fl_function },
     { "function:code", fl_function_code },
@@ -1797,6 +1786,13 @@
     { NULL, NULL }
 };
 
+// initialization -------------------------------------------------------------
+
+extern void builtins_init();
+extern void comparehash_init();
+
+static char *EXEDIR = NULL;
+
 static void lisp_init(void)
 {
     int i;
@@ -1870,6 +1866,9 @@
     setc(symbol("*os-name*"), symbol("unknown"));
 #endif
 
+    the_empty_vector = tagptr(alloc_words(1), TAG_VECTOR);
+    vector_setsize(the_empty_vector, 0);
+
     cvalues_init();
 
     char buf[1024];
@@ -1882,9 +1881,6 @@
 
     memory_exception_value = list2(MemoryError,
                                    cvalue_static_cstring("out of memory"));
-
-    the_empty_vector = tagptr(alloc_words(1), TAG_VECTOR);
-    vector_setsize(the_empty_vector, 0);
 
     assign_global_builtins(core_builtin_info);