From aebafa0ddc3316d2884865f39c121c1dbb8880a2 Mon Sep 17 00:00:00 2001
From: Martin Nilsson <mani@lysator.liu.se>
Date: Tue, 3 Oct 2000 20:20:28 +0200
Subject: [PATCH] Compiles. Better types. More 7.1.

Rev: lib/modules/Languages.pmod/PLIS.pmod:1.11
---
 lib/modules/Languages.pmod/PLIS.pmod | 223 +++++++++++----------------
 1 file changed, 89 insertions(+), 134 deletions(-)

diff --git a/lib/modules/Languages.pmod/PLIS.pmod b/lib/modules/Languages.pmod/PLIS.pmod
index 48cf0a47d9..fc5742f5aa 100644
--- a/lib/modules/Languages.pmod/PLIS.pmod
+++ b/lib/modules/Languages.pmod/PLIS.pmod
@@ -13,20 +13,12 @@
 #define WERROR(x)
 #endif
 
-#if constant(Gmp.mpz)
-#define BIGNUM object
-#define NUMBER(X) Gmp.mpz(X)
-#else
-#define BIGNUM int
-#define NUMBER(X) ( (int) (X) )
-#endif
-
 /* Data shared between all Lisp objects */
 mapping symbol_table = ([ ]);
 
-object Lempty = Nil();
-object Lfalse = Boolean("#f");
-object Ltrue = Boolean("#t");
+Nil     Lempty = Nil();
+Boolean Lfalse = Boolean("#f");
+Boolean Ltrue = Boolean("#t");
 
 object readline;
 
@@ -36,19 +28,16 @@ class LObject
 {
 }
 
-class SelfEvaluating 
+class SelfEvaluating (string name)
 {
   inherit LObject;
-  string name;
-  
-  object eval(object env, object globals)
+
+  SelfEvaluating eval(Environment env, Environment globals)
     {
       return this_object();
     }
 
   string print(int display) { return name; }
-
-  void create(string n) { name = n; }
 }
 
 class Boolean
@@ -59,7 +48,7 @@ class Boolean
 class Cons 
 {
   inherit LObject;
-  
+
   object car;
   object cdr;
 
@@ -74,14 +63,13 @@ class Cons
 
   object mapcar(string|function fun, mixed ...extra)
     {
-      object new_car, new_cdr;
-      new_car = stringp(fun)? car[fun](@extra) : fun(car, @extra);
+      object new_car = stringp(fun)? car[fun](@extra) : fun(car, @extra);
       if (!new_car)
       {
 	werror("No car\n");
 	return 0;
       }
-    
+
       object new_cdr = (cdr != Lempty) ? cdr->mapcar(fun, @extra)
 	: cdr;
       if (new_cdr) 
@@ -92,7 +80,7 @@ class Cons
 	return 0;
       }
     }
-  
+
   object map(string|function fun, mixed ...extra)
     {
       /* Do this as a special case to allow tail recursion */
@@ -112,7 +100,7 @@ class Cons
 	return 0;
       }
     }
-  
+
   string print(int display)
     {
       string s = "(";
@@ -130,8 +118,8 @@ class Cons
       s += " )";
       return s;
     }
-  
-  object eval(object env, object globals)
+
+  object eval(Environment env, Environment globals)
     {
       WERROR(sprintf("eval list: %s\n", print(1)));
       //if (car->name == "read-line")
@@ -166,7 +154,7 @@ class Symbol
 
   string name;
 
-  object eval(object env, object globals)
+  object eval(Environment env, Environment globals)
     {
       WERROR(sprintf("eval symbol '%s'\n", name));
 #if 0
@@ -196,7 +184,7 @@ class Symbol
     {
       return name;
     }
-  
+
   void create(string n, mapping|void table)
     {
       //     werror(sprintf("Creating symbol '%s'\n", n));
@@ -206,7 +194,7 @@ class Symbol
     }
 
   string to_string() { return name; }
-    
+
 }
 
 class ConstantSymbol 
@@ -221,7 +209,7 @@ class Nil
   inherit SelfEvaluating;
 
   // constant is_nil = 1;
-  
+
   void create()
     {
       Cons :: create(this_object(), this_object());
@@ -232,60 +220,48 @@ class Nil
   object map(mixed ...ignored) { return this_object(); }
 }
 
-class String 
+class String (string value)
 {
   inherit SelfEvaluating;
-  string value;
 
   constant is_string = 1;
-  
-  void create(string s)
-    {
-      value = s;
-    }
-  
+
   string print(int display)
     {
       return display ? ("\"" + replace(value, ({ "\\", "\"", "\n",}),
 				       ({ "\\\\", "\\\"", "\\n"}) ) + "\"")
 	: value;
     }
-  
+
   string to_string() { return value; }
 }
 
-class Number 
+class Number (int|float|object value)
 {
   inherit SelfEvaluating;
-  int|float|object value;
 
   constant is_number = 1;
-  
-  void create(int|float|object x) { value = x; }
 
   string print(int display) { return (string) value; }
 }
   
-class Binding 
+class Binding (object value)
 {
-  object value;
   object query() { return value; }
   void set(object v) { value = v; }
-  void create(object v) { value = v; }
 }
   
 class Environment 
 {
   inherit LObject;
   // int eval_limit; // ugly hack..
-      
+
   /* Mapping of symbols and their values.
    * As a binding may exist in several environments, they
    * are accessed indirectly. */
-  mapping env = ([ ]);
-  // object id; // roxen typ ID.
+  mapping(Symbol:object) env = ([ ]);
 
-  object query_binding(object symbol)
+  object query_binding(Symbol symbol)
     {
       return env[symbol];
     }
@@ -297,7 +273,7 @@ class Environment
 
   object copy() { return object_program(this_object())(copy_value(env)); };
 
-  object extend(object symbol, object value)
+  void extend(Symbol symbol, object value)
     {
       //     werror(sprintf("Binding '%s'\n", symbol->print(1)));
       env[symbol] = Binding(value);
@@ -323,22 +299,15 @@ class Environment
     }
 }
   
-class Lambda
+class Lambda (object formals, // May be a dotted list
+	      object list     // expressions
+	      )
 {
   inherit LObject;
 
-  object formals; /* May be a dotted list */
-  object list; /* expressions */
-
-  void create(object formals_list, object expressions)
-    {
-      formals = formals_list;
-      list = expressions;
-    }
-
   string print(int display) { return "lambda "+list->print(display); }
 
-  int build_env1(object env, object symbols, object arglist)
+  int build_env1(Environment env, object symbols, object arglist)
     {
       if (symbols == Lempty)
 	return arglist == Lempty;
@@ -353,15 +322,15 @@ class Lambda
       }
     }
 
-  object build_env(object env, object arglist)
+  Environment build_env(Environment env, object arglist)
     {
-      object res = env->copy();
+      Environment res = env->copy();
       return build_env1(res, formals, arglist) ? res : 0;
     }
 
-  object new_env(object env, object arglist);
-  
-  object apply(object arglist, object env, object globals)
+  object new_env(Environment env, object arglist);
+
+  object apply(object arglist, Environment env, Environment globals)
     {
       if (globals->limit_apply && (globals->limit_apply()))
 	return 0;
@@ -385,7 +354,7 @@ class Lexical
       //		   env->print(1)));
       l :: create(formals_list, expressions);
     }
-  
+
   object new_env(object ignored, object arglist)
     {
       return build_env(env, arglist);
@@ -396,7 +365,7 @@ class Macro
 {
   inherit Lexical;
   constant is_special = 1;
-  object apply(object arglist, object env, object globals)
+  object apply(object arglist, Environment env, Environment globals)
     {
       object expansion = ::apply(arglist, env, globals);
       return expansion && expansion->eval(env, globals);
@@ -406,22 +375,15 @@ class Macro
 class Dynamic 
 {
   inherit Lambda;
-  object new_env(object env, object arglist)
+  object new_env(Environment env, object arglist)
     {
       return build_env(env, arglist);
     }
 }
 
-class Builtin 
+class Builtin (function apply)
 {
   inherit LObject;
-  
-  function apply;
-
-  void create(function f)
-    {
-      apply = f;
-    }
 
   string print(int display)
     {
@@ -441,14 +403,14 @@ class Special
 
 
 /* Misc functions */
-object make_symbol(string name)
+Symbol make_symbol(string name)
 {
   return symbol_table[name] || Symbol(name, symbol_table);
 }
 
-object make_list(object ...args)
+Cons make_list(object ...args)
 {
-  object res = Lempty;
+  Cons res = Lempty;
   for (int i = sizeof(args) - 1; i >= 0; i--)
     res = Cons(args[i], res);
   return res;
@@ -457,23 +419,16 @@ object make_list(object ...args)
 
 /* Parser */
 
-class Parser 
+class Parser (string buffer)
 {
   object number_re = Regexp("^(-|)([0-9]+)");
   object symbol_re = Regexp("^([^0-9 \t\n(.)\"#]+)");
   object space_re = Regexp("^([ \t\n]+)");
   object comment_re = Regexp("^(;[^\n]*\n)");
   object string_re = Regexp("^(\"([^\\\\\"]|\\\\.)*\")");
-  
-  string buffer;
-  
-  void create(string s)
-    {
-      buffer = s;
-     }
 
   object read_list();
-  
+
   mixed _read()
     {
       if (!strlen(buffer))
@@ -492,7 +447,7 @@ class Parser
 	//	werror("Scanning number\n");
 	string s = `+(@ a);
 	buffer = buffer[ strlen(s) ..];
-	return Number( NUMBER(s) );
+	return Number( (int)s );
       }
       if (a = symbol_re->split(buffer))
       {
@@ -508,7 +463,7 @@ class Parser
 			      ({ "\\\\", "\\\"", "\\n" }),
 			      ({ "\\", "\"", "\n"}) ) );
       }
-      
+
       switch(int c = buffer[0])
       {
       case '(':
@@ -549,7 +504,7 @@ class Parser
       }
       return res;
     }
-  
+
   object read_list()
     {
       mixed item = _read();
@@ -562,7 +517,7 @@ class Parser
 	{
 	case ')': return Lempty;
 	case '.':
-	  object fin = _read();
+	  object|int fin = _read();
 	  if (intp(fin) || (_read() != ')'))
 	  {
 	    return 0;
@@ -580,12 +535,12 @@ class Parser
 
 /* Lisp special forms */
 
-object s_quote(object arglist, object env, object globals)
+object s_quote(object arglist, Environment env, Environment globals)
 {
   return arglist->car;
 }
 
-object s_setq(object arglist, object env, object globals)
+object s_setq(object arglist, Environment env, Environment globals)
 {
 //  werror(sprintf("set!, arglist: %s\n", arglist->print(1) + "\n"));
   object value = arglist->cdr->car->eval(env, globals);
@@ -600,7 +555,7 @@ object s_setq(object arglist, object env, object globals)
     return 0;
 }
 
-object s_define(object arglist, object env, object globals)
+object s_define(object arglist, Environment env, Environment globals)
 {
   object symbol, value;
   if (arglist->car->car)
@@ -618,7 +573,7 @@ object s_define(object arglist, object env, object globals)
   return symbol;
 }    
 
-object s_defmacro(object arglist, object env, object globals)
+object s_defmacro(object arglist, Environment env, Environment globals)
 {
   // werror(sprintf("defmacro '%s'\n", arglist->car->car->print(0)));
   object symbol = arglist->car->car;
@@ -628,8 +583,8 @@ object s_defmacro(object arglist, object env, object globals)
   env->extend(symbol, value);
   return symbol;
 }
-  
-object s_if(object arglist, object env, object globals)
+
+object s_if(object arglist, Environment env, Environment globals)
 {
   if (arglist->car->eval(env, globals) != Lfalse)
     return arglist->cdr->car->eval(env, globals);
@@ -637,7 +592,7 @@ object s_if(object arglist, object env, object globals)
   return (arglist != Lempty) ? arglist->car->eval(env, globals) : Lfalse;
 }
 
-object s_and(object arglist, object env, object globals)
+object s_and(object arglist, Environment env, Environment globals)
 {
   if (arglist == Lempty)
     return Ltrue;
@@ -652,11 +607,11 @@ object s_and(object arglist, object env, object globals)
   return arglist->car->eval(env, globals);
 }
 
-object s_or(object arglist, object env, object globals)
+object s_or(object arglist, Environment env, Environment globals)
 {
   if (arglist == Lempty)
     return Lfalse;
-  
+
   while(arglist->cdr != Lempty)
   {
     object res = arglist->car->eval(env, globals);
@@ -667,12 +622,12 @@ object s_or(object arglist, object env, object globals)
   return arglist->car->eval(env, globals);
 }
 
-object s_begin(object arglist, object env, object globals)
+object s_begin(object arglist, Environment env, Environment globals)
 {
   return arglist->map("eval", env, globals);
 }
 
-object s_lambda(object arglist, object env, object globals)
+object s_lambda(object arglist, Environment env, Environment globals)
 {
   return Lexical(env, arglist->car, arglist->cdr);
 }
@@ -682,12 +637,12 @@ object s_lambda(object arglist, object env, object globals)
  *
  * The catch special form catches errors, returning Lfalse
  * if an error occured. */
-object s_catch(object arglist, object env, object globals)
+object s_catch(object arglist, Environment env, Environment globals)
 {
   return s_begin(arglist, env, globals) || Lfalse;
 }
 
-object s_while(object arglist, object env, object globals)
+object s_while(object arglist, Environment env, Environment globals)
 {
   object expr = arglist->car, res;
   object to_eval = arglist->cdr;
@@ -701,46 +656,46 @@ object s_while(object arglist, object env, object globals)
 
 /* Functions */
 
-object f_car(object arglist, object env, object globals)
+object f_car(object arglist, Environment env, Environment globals)
 {
   return arglist->car->car;
 }
 
-object f_cdr(object arglist, object env, object globals)
+object f_cdr(object arglist, Environment env, Environment globals)
 {
   return arglist->car->cdr;
 }
 
-object f_null(object arglist, object env, object globals)
+object f_null(object arglist, Environment env, Environment globals)
 {
   return (arglist->car == Lempty) ? Ltrue : Lfalse;
 }
 
-object f_cons(object arglist, object env, object globals)
+object f_cons(object arglist, Environment env, Environment globals)
 {
   return MutableCons(arglist->car, arglist->cdr->car);
 }
 
-object f_list(object arglist, object env, object globals)
+object f_list(object arglist, Environment env, Environment globals)
 {
   return arglist;
 }
 
-object f_setcar(object arglist, object env, object globals)
+object f_setcar(object arglist, Environment env, Environment globals)
 {
   if (arglist->car->is_mutable_cons)
     return arglist->car->car = arglist->cdr->car;
   return 0;
 }
 
-object f_setcdr(object arglist, object env, object globals)
+object f_setcdr(object arglist, Environment env, Environment globals)
 {
   if (arglist->car->is_mutable_cons)
     return arglist->car->cdr = arglist->cdr->car;
   return 0;
 }
 
-object f_eval(object arglist, object env, object globals)
+object f_eval(object arglist, Environment env, Environment globals)
 {
   if (arglist->cdr != Lempty)
   {
@@ -754,14 +709,14 @@ object f_eval(object arglist, object env, object globals)
   return arglist->car->eval(env, globals);
 }
 
-object f_apply(object arglist, object env, object globals)
+object f_apply(object arglist, Environment env, Environment globals)
 {
   return arglist->car->apply(arglist->cdr->car, env, globals);
 }
 
-object f_add(object arglist, object env, object globals)
+object f_add(object arglist, Environment env, Environment globals)
 {
-  BIGNUM sum = NUMBER(0);
+  int sum = 0;
 
   while(arglist != Lempty)
   {
@@ -773,9 +728,9 @@ object f_add(object arglist, object env, object globals)
   return Number(sum);
 }
 
-object f_mult(object arglist, object env, object globals)
+object f_mult(object arglist, Environment env, Environment globals)
 {
-  BIGNUM product = NUMBER(1);
+  int product = 1;
 
   while(arglist != Lempty)
   {
@@ -787,10 +742,10 @@ object f_mult(object arglist, object env, object globals)
   return Number(product);
 }
 
-object f_subtract(object arglist, object env, object globals)
+object f_subtract(object arglist, Environment env, Environment globals)
 {
   if (arglist == Lempty)
-    return Number( NUMBER(0) );
+    return Number( 0 );
 
   if (!arglist->car->is_number)
     return 0;
@@ -810,26 +765,26 @@ object f_subtract(object arglist, object env, object globals)
   return Number(diff);
 }
 
-object f_equal(object arglist, object env, object globals)
+object f_equal(object arglist, Environment env, Environment globals)
 {
   return ( (arglist->car == arglist->cdr->car)
 	   || (arglist->car->value == arglist->cdr->car->value))
     ? Ltrue : Lfalse;
 }
 
-object f_lt(object arglist, object env, object globals)
+object f_lt(object arglist, Environment env, Environment globals)
 {
   return (arglist->car->value < arglist->cdr->car->value)
     ? Ltrue : Lfalse;
 }
 
-object f_gt(object arglist, object env, object globals)
+object f_gt(object arglist, Environment env, Environment globals)
 {
   return (arglist->car->value > arglist->cdr->car->value)
     ? Ltrue : Lfalse;
 }
 
-object f_concat(object arglist, object env, object globals)
+object f_concat(object arglist, Environment env, Environment globals)
 {
   string res="";
   do {
@@ -840,13 +795,13 @@ object f_concat(object arglist, object env, object globals)
   return String( res );
 }
 
-object f_read_string(object arglist, object env, object globals)
+object f_read_string(object arglist, Environment env, Environment globals)
 {
   if (arglist->car->is_string)
     return Parser(arglist->car->to_string())->read();
 }
 
-object f_readline(object arglist, object env, object globals)
+object f_readline(object arglist, Environment env, Environment globals)
 {
   if (!arglist->car->is_string)
     return 0;
@@ -855,7 +810,7 @@ object f_readline(object arglist, object env, object globals)
   return s ? String(s) : Lfalse;
 }
 
-object f_display(object arglist, object env, object globals)
+object f_display(object arglist, Environment env, Environment globals)
 {
   while(arglist != Lempty)
   {
@@ -866,12 +821,12 @@ object f_display(object arglist, object env, object globals)
   return Lfalse;
 }
 
-object f_global_environment(object arglist, object env, object globals)
+object f_global_environment(object arglist, Environment env, Environment globals)
 {
   return globals;
 }
 
-void init_specials(object environment)
+void init_specials(Environment environment)
 {
   environment->extend(make_symbol("quote"), Special(s_quote));
   environment->extend(make_symbol("set!"), Special(s_setq));
@@ -887,7 +842,7 @@ void init_specials(object environment)
   environment->extend(make_symbol("catch"), Special(s_catch));
 }
 
-void init_functions(object environment)
+void init_functions(Environment environment)
 {
   environment->extend(make_symbol("+"), Builtin(f_add));
   environment->extend(make_symbol("*"), Builtin(f_mult));
@@ -943,9 +898,9 @@ Parser(
   "		(cons (map car decl) body))\n"
   "	  (map cadr decl))))")->read();
 
-object default_environment()
+Environment default_environment()
 {
-  object env = Environment();
+  Environment env = Environment();
   init_specials(env);
   init_functions(env);
   default_boot_code->eval(env, env);
@@ -954,7 +909,7 @@ object default_environment()
 
 void main()
 {
-  object e = default_environment();
+  Environment e = default_environment();
   // e->extend(make_symbol("global-environment"), e);
   readline = Stdio.Readline();
   readline->enable_history(512);
-- 
GitLab