多重环境 (统一的变量捕捉模型)

    技术2022-05-20  29

    (setq  chenbing  91234)(print  chenbing)

    (+  chenbing   6) (setq  bingchen  10)(+ chenbing  bingchen)

    (defun  fibs ( x)(if  (>  x  0)   (+   (fibs  (- x  1 ) )  (fibs  (-  x  2  ) ) )  (+  0  1 ) ))

    (fibs 5)(fibs 6)(para (fibs  5 )  (fibs  6) )

    (setq  chenbing  91234)(print  chenbing)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    #include  <ctype.h>#include  <assert.h>#include  <stdlib.h>#include  <stdio.h>#include  <memory.h>#include <stdarg.h>#include <string.h>#include <setjmp.h>#include  <time.h>#include  <process.h>

    #define  MAX  1000int  vec_global=0;

    typedef void  *  (*funp )(void * _left);enum tokens {    NUMBER = 'n',    NAME};

    char * sdl_fun[]={"print","1+","1-","+","cons","cadr","caddr"};typedef enum  Enum{ EMPTY=1,INT,CHAR,FUN,DEFUN,DEFMACRO,VAR,COND,QUOTE,LIST,QUOTE2,  IF,PROGN,EVAL,SETQ,SETF,PARA,EQ,CONSTREAM,TAIL,CALLCC,SYMBOL,JMPBUF}Enum;typedef  enum  forth{ ADD=100,MINUS,GETFIRST,DIGIT,TEST,RET,RAND,CALL,GO,PTR,PUSH,  END,GET,POP,PRINT,NOTHING,SETRET,POPRET,BACK,GETTOP,FUNCALL,LAMBDA}forth;

    typedef struct   Type{ enum Enum  em; funp  f_data; union  {  int i_data;  //  char c_data;  char s_data[30];    struct Type  *   n_data; } u_data; struct Type * next; struct env   *m_env;}Type;typedef struct   env_var{ Type  *name; Type  *value; }env_var;typedef struct env_defun{ Type  *name; Type  *arg; Type  *expr;}env_defun;typedef struct env_defmacro{ Type  *name; Type  *arg; Type  *expr;}env_defmacro;Type *global_defun=NULL;Type  *global_defmacro=NULL;Type  *global_jmpbuf=NULL;

    #define  NUM  1000Type   *mem_manager;int  global_count=20000;int mem_count=0;Type*  new_object(){ Type *temp; if(global_count<2*mem_count) {  temp=mem_manager;  global_count=2*global_count;  mem_manager=(Type *)malloc  (global_count  *sizeof (Type ) );  memmove(mem_manager,temp,mem_count*sizeof (Type ) );  free(temp); } return  &mem_manager[mem_count++];}void  *  empty2_type(void){ Type  *result= new_object(); result->em=INT;  result->u_data.i_data=999999; return  result;}void  *  empty_type(void){ Type  *result= new_object(); result->em=EMPTY;  result->u_data.i_data=999999; return  result;}void * c_copy_type2(void *_right){  Type *left; Type  *right=_right; if(right->em==EMPTY)  return right;   //空值不需要拷贝 left= new_object()   ;  memcpy(left,right,sizeof( Type) );  return  left; }

    void * c_cons (void * _left,void *  _right){  Type  *type_data;  type_data= new_object()   ; type_data->em=LIST;   type_data->u_data.n_data=_left; type_data->next=_right; return  type_data; }void * c_constream (void * _left,void *  _right){  Type  *type_data;  type_data=  new_object()   ; type_data->em=CONSTREAM;   type_data->u_data.n_data=_left; type_data->next=_right; return  type_data; }void  *eval (void ** );void  *c_car (void  *);void * c_car_address (void * _left){  Type * left=_left; if(left->em==EMPTY)  return empty_type(); assert(left->em==LIST);   return &(left->u_data.n_data); }void * c_car (void * _left){  Type * left=_left; if(left->em==EMPTY)  return empty_type(); assert(left->em==LIST||left->em==CONSTREAM);  //modidify at  2010.1.8   return left->u_data.n_data; }void * c_cdr (void * _left){   Type * left=_left; if(left->em==EMPTY)  return empty_type(); assert(left->em==LIST);   return    left->next;}

    void * wrap_c_cons(void * _left){   Type *left=_left; return  c_cons   (  c_car  (left ) , c_cdr (left) );}

    void *  int_type(int  i);int c_eq(void  *_left,void  *_right){ Type*left=_left; Type  *right=_right;  if(c_atom (left )&&c_atom (right) ) {  if   (left->u_data.i_data==right->u_data.i_data)   return  1;  return  0; } else  return 0;}void *c_cadr(void  *_left);void * wrap_c_eq(void * _left){   Type *left=_left;  Type  *type_data;  type_data= new_object() ; type_data->em=INT; type_data->u_data.i_data=  c_eq   (  c_car  (left ) , c_cadr (left) ); return  type_data;}void * wrap_c_atom(void * _left){   Type *left=_left;  Type  *type_data;  type_data=  new_object()  ; type_data->em=INT; type_data->u_data.i_data=  c_atom   ( left ); return  type_data;}void * wrap_c_list(void * _left){ return  _left;}

    int  c_not (int  i){ if(i==1)  return 0; else return 1;}int  c_atom(void  *_left){ Type  *left=_left; if(left->em==LIST)  return  0;  return   1;}

    void * c_appdix (void * _left,void *  _right){ Type * left=_left; Type * right=_right;    if( left->em==EMPTY)  return  c_cons (right ,empty_type() ); else  return c_cons  (  c_car ( left) ,   c_appdix ( c_cdr (left ) ,right ) ); }void * c_list (void *left , ...){ Type * ele_left; Type *  ele_right; va_list ap; ele_left=left; ele_left=c_cons (  ele_left , empty_type()) ; va_start(ap, left);   while (1) {   ele_right=va_arg(ap, void *);    if(ele_right)   ele_left=c_appdix (  ele_left,ele_right );  else  {       break;  }    } va_end(ap);  return  ele_left;}

    //some  aux  functionvoid  *c_caar(void  *_left){ return c_car(c_car(_left));}void  * c_cddr(void  *_left){ return  c_cdr(c_cdr(_left));}void  *c_caddr(void  *_left){ return c_car( c_cddr(_left) );}

    void  *c_cdar(void  *_left){ return c_cdr(c_car(_left));}void *c_cadr(void  *_left){ return c_car(c_cdr(_left));}

    void  *c_cadar(void  *_left){ return  c_car(c_cdr(c_car(_left)));}void *c_cadadr(void  *_left){ return  c_car(c_cdr(c_car(c_cdr(_left))));}void *  int_type(int  i){ Type  *result=  new_object()  ; result->em=INT; result->u_data.i_data=i; return  result;}void  *  set_type(Enum type){ Type  *result= new_object()   ; result->em=type;  return  result;}void * left_print(void *  _left){ Type  *left=_left; Type  *temp;  if(!left) {  return empty_type(); } if (  left->em==EMPTY) {   return empty_type(); }   else if(left->em==INT&&left->u_data.i_data==999999)  printf("%s ","nil"); else if(left->em==INT)  printf("%d ",left->u_data.i_data); else if(left->em==VAR)  printf("%s  ",left->u_data.s_data); else if(left->em==FUN)  printf("%s   ",left->u_data.s_data); else if(left->em==QUOTE)  printf("%s  ","quote"); else if(left->em==DEFUN)  printf("%s   ","defun"); else if(left->em==FUNCALL)  printf("%s   ","funcall"); else if(left->em==DEFMACRO)  printf("%s   ","defmacro"); else if(left->em==SETQ)  printf("%s  ","setq"); else if(left->em==SETF)  printf("%s  ","setf"); else if(left->em==IF)  printf("%s  ","if"); else if (left->em==LIST) {    printf("  (  ");  for (  temp=left;  temp->em!=EMPTY ;temp= c_cdr (temp) )  {   left_print (   c_car (temp) );   }  printf(" ) "); } return  left;}void * right_print(void *  _left){ Type  *left=_left;  if (  left->em==EMPTY) {   return empty_type(); }   else if(left->em==INT&&left->u_data.i_data==999999)  printf("%s ","nil"); else if(left->em==INT)  printf("%d ",left->u_data.i_data); else if(left->em==VAR)  printf("%s  ",left->u_data.s_data); else if(left->em==FUN)  printf("%s   ",left->u_data.s_data); else if(left->em==QUOTE)  printf("%s  ","quote"); else if(left->em==DEFUN)  printf("%s   ","defun"); else if(left->em==DEFMACRO)  printf("%s   ","defmacro"); else if(left->em==FUNCALL)  printf("%s   ","funcall"); else if(left->em==SETQ)  printf("%s  ","setq"); else if(left->em==SETF)  printf("%s  ","setf"); else if(left->em==IF)  printf("%s  ","if"); else if (left->em==LIST) {    right_print( c_cdr (left)  );  right_print( c_car (left)  ); } return  left;}void * wrap_print(void *  _left){ printf ("  /n  "); return left_print(_left);}

    void * original_big(void * _left){  int  result; Type  *left=c_car (_left ) ,*right=c_cadr (_left) ; result=(( Type *)left)->u_data.i_data-(( Type *)right)->u_data.i_data; return result>=0?int_type(1):int_type(-1);}void * original_add1(void * _left){  Type  *left=_left; Type  *result= new_object()  ;  result->em=INT; result->u_data.i_data=(( Type *)left)->u_data.i_data+1; return  result;}void * original_add(void * _left){  Type *temp; Type  *left=_left; Type  *result=  new_object()   ;  result->em=INT; result->u_data.i_data=0; for(temp=left;temp->em!=EMPTY;temp=c_cdr (temp) )  result->u_data.i_data+=(( Type *)c_car(temp))->u_data.i_data; return  result;}void * original_minus(void * _left){  Type *temp; Type  *left=_left; Type  *result=  new_object()   ;  result->em=INT; result->u_data.i_data=(( Type *)c_car(left))->u_data.i_data; for(temp=c_cdr (left );temp->em!=EMPTY;temp=c_cdr (temp) )  result->u_data.i_data-=(( Type *)c_car(temp))->u_data.i_data; return  result;}void * original_minus1(void * _left){  Type  *left=_left; Type  *result=  new_object()   ;  result->em=INT; result->u_data.i_data=(( Type *)left)->u_data.i_data-1; return  result;}

    typedef  struct Fun_info{ char  name[20]; funp  address;}Fun_info;

    void  *c_defun (void *name,void *arg,void *expr){ env_defun  *defunvar=(env_defun*)malloc  (sizeof  (env_defun) ); defunvar->name=name; defunvar->arg=arg; defunvar->expr=expr; global_defun=c_cons ( c_cons ( defunvar ,empty_type() ),global_defun); return  name;}int c_atom (void *);void * orignal_add1(void * _left);Fun_info orignal_fun[]={{"print",wrap_print},{"1+",original_add1},{"1-",original_minus1},{"+",original_add},{">",original_big},{"-",original_minus},{"cons",wrap_c_cons},{"car",c_car},{"cdr",c_cdr},{"cadr",c_cadr},{"caddr",c_caddr},{"atom",wrap_c_atom},{"list",wrap_c_list},{"eq",wrap_c_eq},{"",0}};

    void  *  fun_type(char *name){  int  sign; Type  *result= new_object()   ; result->em=FUN; sign=0;  while(1) {  if(!strcmp("",orignal_fun[sign].name))  {   break;  }  else if(!strcmp(name,orignal_fun[sign].name))  {   result->f_data=orignal_fun[sign].address;   break;  }           else   sign++; } strcpy(result->u_data.s_data,name); return  result;}//similar  to  the  macro  dispatchvoid *  eval(void  *_left,void **_env);void * eval_cond (void  *_left,void **_env){ Type *left=_left; if (  left->em==EMPTY)  return empty_type(); if(   c_atom (  c_caar (left) )) {  if(c_not( c_eq (  c_caar (left) ,int_type(0) ) ))   return  eval  ( c_cadar (left ),_env ) ;     return  eval_cond ( c_cdr (left) ,_env); } else {  if(c_not( c_eq ( eval ( c_caar (left) ,_env) ,int_type( 0) ) ))   return  eval  ( c_cadar (left ) ,_env) ;  return  eval_cond ( c_cdr (left) ,_env); }}void*  left_print  (void  *);void * eval_progn (void  *_left,void **_env){ Type  *left=_left; if (  (( Type *)c_cadr (left))->em==EMPTY)  return  eval  ( c_car  (left ),_env ) ; else {  eval  (c_car  (left) ,_env) ;   return eval_progn  (c_cdr (left ),_env ); } }

    void  c_set_global_var_value (void *name,void  *value  ,void ** _env ) { Type  *result=  new_object()   ;  Type *var=c_cadr(*_env); env_var *label=(env_var *)malloc (sizeof (env_var) ); label->name=c_copy_type2(name); label->value=value; result=c_cons (c_cons ( c_cons (  label ,empty_type() ),empty_type() ),var); *_env= c_cons  (   c_car  (*_env ) ,  c_cons  (   result  ,  empty_type() ) ) ; }void  eval_setq (void  *_left,void **_env){ Type  *left=_left; if  ( ((  Type *)c_cadr ( c_cdr (left )))->em==EMPTY) {  c_set_global_var_value (  c_car  (left ), eval ( c_cadr (left ),_env )  , _env ); } else {  c_set_global_var_value (  c_car  (left ),eval ( c_cadr (left ),_env )  ,  _env );  eval_setq  (  c_cddr (left),_env ); }}void * eval_setf (void  *_left,void  **_env){ /* Type  *left=_left; if  ( ((  Type *)c_cadr ( c_cdr (left )))->em==EMPTY) {  return c_bindvar_ex (  c_car  (left ),eval ( c_cadr (left ) ,_env) ); } c_bindvar_ex (  c_car  (left ),eval ( c_cadr (left ) ,_env) ); return eval_setf  (  c_cddr (left) ,_env); */ return  NULL;}

    void  *var_type (char * name){  Type  *result=  new_object()   ; result->em=VAR; strcpy(result->u_data.s_data,name); return  result;}

    void *  c_bindvar_help(void *name,void *value){ env_var  *data=(env_var *)malloc  (sizeof  (env_var) ); data->name=c_copy_type2(name); data->value=value; return  data;}

    void * c_bindvar (void *_left,void *_right){ Type  *left=_left,*right=_right; if(left->em==EMPTY) {  return  empty_type(); } else {  return c_cons ( c_bindvar_help ( c_car (left),c_car (right) ) ,   c_bindvar  ( c_cdr (left),c_cdr (right)  )    ); }}

     

    void  *c_find_defun_arg(void *name){ Type  *_env=global_defun; env_defun  *label; while(_env) {  label=c_car ( c_car (_env) );  if(!strcmp(label->name->u_data.s_data,   ((  Type *)name)->u_data.s_data))  {   return label->arg;  }  _env=c_cdr (_env) ; } return  NULL;}void  *c_find_defun_expr(void *name){  Type  *_env=global_defun;  env_defun  *label; while(_env) {  label=c_car ( c_car(_env) );  if(!strcmp(label->name->u_data.s_data,   ((  Type *)name)->u_data.s_data))  {   return label->expr;  }  _env=c_cdr (_env); } return  NULL; }void  *c_find_defmacro_arg(void *name){ Type  *_env=global_defmacro; env_defun  *label; while(_env) {  label=c_car ( c_car (_env) );  if(!strcmp(label->name->u_data.s_data,   ((  Type *)name)->u_data.s_data))  {   return label->arg;  }  _env=c_cdr (_env); } return  NULL; }void  *c_find_defmacro_expr(void *name){ Type * _env=global_defmacro;  env_defmacro  *label; while(_env) {  label=c_car ( c_car (_env) ) ;  if(!strcmp(label->name->u_data.s_data,   ((  Type *)name)->u_data.s_data))  {   return label->expr;  }  _env=c_cdr  (_env) ; } return  NULL;}

    void  *c_defmacro (void *name,void *arg,void *expr){   env_defmacro  *defunvar=(env_defmacro*)malloc  (sizeof  (env_defmacro) ); defunvar->name=name; defunvar->arg=arg; defunvar->expr=expr; global_defmacro=c_cons (c_cons ( defunvar ,empty_type() ) ,global_defmacro ); return  NULL;  }

    void *  wrap_eval(void  *_left,void **_env);void *  eval_simple(void  *_left,void **_env){ Type *left=_left;  if (  left->em==EMPTY)  return empty_type(); else if  (  c_atom (left) )  return  left; else if  ( ( (  Type *)  c_car (left ) )->em==EVAL)  return c_cons  (  eval ( c_cadr (left ),_env ) , eval_simple ( c_cddr (left ) ,_env) ); else   return c_cons  ( eval_simple(  c_car (left ) ,_env), eval_simple ( c_cdr (left ) ,_env) ); }void  *c_find_var_value_help (void  *_left,void *_lst){ Type *left=_left,*lst=_lst; if(lst->em==EMPTY)  return  NULL; if(!strcmp(left->u_data.s_data, ( (env_var *)c_car (lst ) )->name->u_data.s_data)) {  return     ((env_var *)c_car (lst ) )->value ; } else {  return  c_find_var_value_help (left, c_cdr  (lst)  ); } }

    void  *c_find_var_value (void *_left,void  *env) { Type  *left=_left,*result ,*m_env;  Type *_env=env; while (_env->em!=EMPTY) {  m_env=c_car (_env) ;  while(m_env->em!=EMPTY)  {   if(result=c_find_var_value_help (left,  c_car ( c_car (m_env) )   )  )    return  result;   m_env=c_cdr (m_env) ;  }  _env=c_cdr (_env); }  return  NULL;}

    void  *sub_expr (void *_left,void *_env){ Type *left=_left,*temp;  if(left->em==EMPTY)  return  empty_type(); if(   ((Type*)c_car (_left))->em==VAR)  {  temp=c_find_var_value( c_car(left ) ,_env);  if(!temp)  {      return c_cons (c_car (_left ) , sub_expr (c_cdr (_left) ,  _env )  );      }  else  {   return c_cons ( temp  , sub_expr (c_cdr (_left) ,  _env )  );     }     } else if(   ((Type*)c_car (_left))->em==LIST)  {  return c_cons ( sub_expr (c_car (_left) ,  _env )   , sub_expr (c_cdr (_left) ,  _env )  );  } else {  return c_cons (c_car (_left ) , sub_expr (c_cdr (_left) ,  _env )  );  }}

    void * random_name (){ int i=0; char  name[9]="/0"; srand (time (NULL) );  for(i=0;i<8;i++) {  name[i]=rand()&+'a'; } return  var_type(name); }

    Type * out=NULL;jmp_buf global ;wrap_longjmp (void  *_temp,void *_result){ jmp_buf  *temp_buf; Type * temp=_temp; global_jmpbuf= c_cdr(global_jmpbuf ); temp_buf=c_car (temp ); out= _result; longjmp ( global ,out);}void * wrap_setjmp (void  *left,void  **_env){ int  retn; jmp_buf  *temp_buf=(jmp_buf*)malloc  (sizeof (jmp_buf) );  if(setjmp(global)) {   return  out; } else {  ((Type*) temp_buf)->em=JMPBUF;  global_jmpbuf=c_cons ( temp_buf,global_jmpbuf);  return wrap_eval ( c_cons (    eval ( c_cadr (left)  ,_env) , c_cons (global_jmpbuf,empty_type() )    )    ,_env ) ; }}

    void *  eval(void  *_left,void **_env){  Type  *temp; Type  *left=_left;  Type  *head=NULL; if(left->em==EMPTY)  return  empty_type(); else if(left->em==VAR ) {  if(temp=c_find_var_value(left ,*_env) )  {   return  temp;  }   else  {   return  left;  } } else if (left->em==INT)  return  left; assert(left->em==LIST); head=c_car (left );  switch(head->em) { case  JMPBUF:  return  left; case   SYMBOL:  return eval ( eval(c_cadr (left ),_env) ,_env);  break; case  CALLCC:    return wrap_setjmp(left,_env);  break; case  FUNCALL:  temp= eval(c_cadr (left ),_env);  if(temp->em==LIST)  {   wrap_longjmp(temp,c_caddr (left ));     }  else  {      return wrap_eval ( c_cons ( temp,c_caddr (left) )  ,_env);     }  break; case  LAMBDA:  return  c_defun ( random_name( ) ,c_cadr (left ), sub_expr ( c_caddr (left ),*_env ) );    break; case  TAIL:  if ( ((Type*) c_cadr (left ))->em==LIST)    {   return  eval  ( c_cdr (  c_cadr  (left) ),_env );  }  else  {   return  eval  ( c_cdr ( eval ( c_cadr  (left)  ,_env)  ),_env );  }  break; case  CONSTREAM:  return c_cons ( eval  (  c_cadr (left ) ,_env) , sub_expr ( c_caddr (left )  ,*_env  )  );  break; case  SETQ:  eval_setq ( c_cdr (left),_env ) ;  break; case  SETF:  return eval_setf ( c_cdr (left),_env ) ;  break; case IF:  if (c_eq ( eval (   c_cadr ( left ) ,_env ) ,  int_type(1) ) )   return  eval ( c_caddr ( left) ,_env)  ;  else    return eval  (c_cadr (c_cddr ( left ) ),_env);  break; case PROGN:  return eval_progn ( c_cdr  (left),_env);  break; case QUOTE2:  return   eval_simple ( c_cadr (left),_env ) ;  break;   case  INT:  if((( Type *) c_caddr ( left))->em ==EMPTY )   return c_cons (head, c_cons (eval  (  c_cadr (left) ,_env),empty_type())   );  return   c_cons (head, eval (c_cdr (left),_env ) );  break; case  COND:  return eval_cond ( c_cdr  (left) ,_env);    break; case  FUN:   if((( Type *) c_caddr ( left))->em ==EMPTY )   return left_print (  head->f_data( eval  (  c_cadr (left),_env )   ));  return left_print  ( head->f_data( eval  (  c_cdr (left) ,_env)   ));  break; case DEFUN:  return  c_defun (c_cadr (left ), c_caddr (left ),c_cadr (c_cddr (left ) ));  break; case VAR:  if(temp=c_find_var_value ( head, *_env) )  {   if((( Type *) c_caddr ( left))->em ==EMPTY )    return c_cons (temp, c_cons (eval  (  c_cadr (left),_env ),empty_type())   );   return c_cons( temp ,eval ( c_cdr (left),_env ));  }   else   return wrap_eval (left,_env);  break;  case  DEFMACRO:  return c_defmacro (c_cadr (left ), c_caddr (left ),c_cadr (c_cddr (left ) ) );  break; case  QUOTE:  return   c_cadr (left) ;  break; case  LIST:  if((( Type *) c_caddr ( left))->em ==EMPTY )   return c_cons (eval  ( c_car  (left ),_env ),    c_cons (eval  (  c_cadr (left) ,_env),empty_type())   );  return   c_cons (eval  ( c_car  (left ) ,_env), eval (c_cdr (left),_env ) );  break;    /*  handle  this  (defun  again  (  x  y)   (print  (+  x  y)  )  )  (again  10  (again  (again 1  2)  40) )  */ } return  NULL; }

    void ** c_bindvars(void *_left,void * _right,void **_env){ Type *left=_left; Type *right=_right; Type *m_env=c_car ( *_env ); if(left->em!=EMPTY) {  m_env=c_cons (c_cons ( c_bindvar( left , right ) ,empty_type() )  , m_env );  *_env =c_cons ( m_env , c_cdr (*_env ) );  return  _env; } else {  return  _env; }}void  c_unbindvars(void **_env){ Type *result= c_car (*_env ) ; result=c_cdr (result ); *_env=c_cons (result ,  c_cdr (*_env ) );}typedef  struct  wrap_struct{ void  *_left; void  **_env;}wrap_struct;void  eval_special (void  *_struct){ Type *result=NULL; wrap_struct  *w=_struct; result=eval  (w->_left,w->_env); printf("/n/n"); left_print(result);}void *  wrap_eval(void  *_left,void **_env){ Type *tempname; Type *tempvalue; Type *result=NULL; Type  *left=_left;   Type  *head=NULL;  int  count=0; unsigned pid; wrap_struct  w,ww; Type  *e,*ee;    if(left->em==VAR )  return   c_find_var_value(left,*_env)  ; else if (left->em==INT)  return  left ; assert(left->em==LIST); head=c_car (left ); if((tempname=c_find_defmacro_arg(head))) {    tempvalue=c_cdr (left );  result= eval ( eval  (  c_find_defmacro_expr(head)  ,_env) ,   c_bindvars( tempname, tempvalue,_env )) ;  c_unbindvars( _env );  }     else if((tempname=c_find_defun_arg(head))) {  tempvalue=eval( c_cdr (left ),_env );    result=  eval  ( c_find_defun_expr(head),   c_bindvars( tempname, tempvalue,_env )   )  ;  c_unbindvars( _env ); }     else {  if( head->em==PARA)  {   e=new_object() ;   e=*_env;   w._left=c_cadr(left);   w._env=&e;   _beginthreadex(NULL,0,     (unsigned (__stdcall *) (void *))eval_special,(void *)&w ,0,&pid);   ee=new_object() ;   ee=*_env;   ww._left=c_caddr(left);   ww._env=ⅇ      _beginthreadex(NULL,0,     (unsigned (__stdcall *) (void *))eval_special,(void *)&ww ,0,&pid);   while(count>=0)   {    count++;       }  }  else  {   result=  eval  (  left ,_env)  ;        } }  return  result;}static enum tokens token; /* current input symbol */static int number;  /* if NUMBER: numerical value */static char  name[20]; static  char alpha_ex[]="abcdefghijklmnopqrstuvwxyz_!";int isalpha_ex(char *test){ int  i=0; for(i=0;alpha_ex[i]!='/0';i++)  if(alpha_ex[i]==test)   return  1;  return  0;  }static enum tokens scan (const char * buf)/* return token = next input symbol */{  static const char * bp;     int sign=0; memset(name,0,sizeof(name));  if (buf)  bp = buf;   /* new input line */    while (isspace(* bp & 0xff))  ++ bp; if (isdigit(* bp & 0xff) || * bp == '.') {   errno = 0;  token = NUMBER, number = strtod(bp, (char **) & bp);   } else if (isalpha_ex(* bp & 0xff) || * bp == '.') {  errno = 0;  token = NAME;   while(isalpha_ex(* bp & 0xff))   name[sign++]=*bp++; } else  token = * bp ? * bp ++ : 0; return token;}static void * factor (void){  Type  *result; int  sign; Type * ele_left; Type *  ele_right;  scan(0); switch (token)  { case  NAME:   sign=0;  while(1)  {   if(!strcmp("",orignal_fun[sign].name))   {    break;   }   else if(!strcmp(name,orignal_fun[sign].name))   {    result=  new_object()   ;      result->em=FUN;    result->f_data=orignal_fun[sign].address;    strcpy(result->u_data.s_data,name);    return  result;    break;   }            else    sign++;  }  if(!strcmp("constream",name))  {   return  set_type(CONSTREAM);  }  if(!strcmp("tail",name))  {   return  set_type(TAIL);  }   if(!strcmp("symbol",name))  {   return  set_type(SYMBOL);  }  if(!strcmp("defun",name))  {   return  set_type(DEFUN);  }  else if(!strcmp("defmacro",name))  {   return  set_type(DEFMACRO);  }  else if(!strcmp("if",name))  {   return  set_type(IF);  }  else if(!strcmp("progn",name))  {   return  set_type(PROGN);  }  else if(!strcmp("nil",name))  {   return  empty2_type();  }  else if(!strcmp("setq",name))  {   return  set_type(SETQ);  }  else if(!strcmp("setf",name))  {   return  set_type(SETF);  }    else if(!strcmp("cond",name))  {   return  set_type(COND);  }    else if(!strcmp("ptr",name))  {   return  set_type(PTR);  }      else if(!strcmp("push",name))  {   return  set_type(PUSH);  }    else if(!strcmp("funcall",name))  {   return  set_type(FUNCALL);  }    else if(!strcmp("lambda",name))  {   return  set_type(LAMBDA);  }  else if(!strcmp("callcc",name))  {   return  set_type(CALLCC);  }  else if(!strcmp("get",name))  {   return  set_type(GET);  }    else if(!strcmp("pop",name))  {   return  set_type(POP);  }  else if(!strcmp("gettop",name))  {   return  set_type(GETTOP);  }   else if(!strcmp("nothing",name))  {   return  set_type(NOTHING);  }  else if(!strcmp("setret",name))  {   return  set_type(SETRET);  }    else if(!strcmp("popret",name))  {   return  set_type(POPRET);  }    else if(!strcmp("end",name))  {   return  set_type(END);  }    else if(!strcmp("para",name))  {   return  set_type(PARA);  }    else  {   return var_type (name);    } case NUMBER:  return int_type (number);  break; case '(':   ele_left=factor();  if(!ele_left)  {   return  c_cons (empty_type(),empty_type());  }  ele_left=c_cons (  ele_left , empty_type()) ;      while (1)  {    ele_right=factor();     if(ele_right)   {    ele_left=c_appdix (  ele_left,ele_right );   }   else   {        break;   }      }  return  ele_left;  break; case ')':  return NULL;  break; case '+':  return fun_type("+");  break;  case '>':  return fun_type(">");  break;  case '-':  return fun_type("-");  break; case  '/'':  return  c_list ( set_type(QUOTE),factor(),0 ); case  '/`':  return  c_list ( set_type(QUOTE2),factor(),0 ); case  '/,':  return   set_type(EVAL);   } return NULL;}static jmp_buf onError;int main (void){  int  i,sign; Type * ele_left; Type *  ele_right;  FILE *in; volatile int errors = 0;  char buf [8*BUFSIZ];  Type  *m_env; mem_manager=(Type *)malloc  (global_count  *sizeof (Type ) ); for(i=0;i<global_count;i++) {  mem_manager[i].m_env=NULL;   //add  by  chenbing  2011.1.13 }

     m_env=empty_type();  /*  for(i=0;i<MAX;i++) {  compi[i].address=0; }    */  if (setjmp(onError))  ++ errors;  global_jmpbuf=empty_type();  sign=0; in=fopen("c://test.txt","r"); while(1) {  buf[sign]=fgetc(in);  if(feof(in))   break;  sign++; }  scan(buf); while (token== '(') {      ele_left=factor();  ele_left=c_cons (  ele_left , empty_type()) ;      while (1)  {    ele_right=factor();     if(ele_right)    ele_left=c_appdix (  ele_left,ele_right );   else   {     left_print(ele_left);    //   right_print(ele_left);    left_print  ( wrap_eval ( ele_left,&m_env)  );    printf("/n/n");    //   right_eval ( ele_left)  ;     //   right_print  ( stack_pop() );    /*    printf(  "  /n  ");    temp=right_compile(c_cons( ele_left,empty_type() )  ,-99 )  ;     if( ((Type *) c_car (ele_left ) )->em!=DEFUN)    {          //  right_interpret (temp);      // serial(temp);      // right_interpret (  unserial()  );          right_install (temp);      }      else      {      for(i=0;i<unsolve_count;i++)      {      for(j=0;j<compi_count;j++)      {      if(!CODE[  unsolve[i].address ]&&!strcmp(unsolve[i].name,compi[j].name))      {      CODE[  unsolve[i].address ]=compi[j].address;      }      }            }       if(!SYS)SYS=temp;           }    */    break;       }   }   token=scan(0); } // right_interpret ( ); return errors > 0;}

    void error (const char * fmt, ...){  va_list ap;  va_start(ap, fmt); vfprintf(stderr, fmt, ap), putc('/n', stderr); va_end(ap); longjmp(onError, 1);}

     


    最新回复(0)