aboutsummaryrefslogblamecommitdiff
path: root/eval.cpp
blob: bf61b3edabee9ba86804fc1129537e96670e99c8 (plain) (tree)
1
2
3
4
5
6
7
8

                    

                   
               

                 
                        


                                        
 


                                             


                                                   


                                                
                                           
                                              
                                            
                                          

                                              

                                              


                                   
                                   


                                   
                                   
                                  
                                   

                                  

                                                 
                                           



                                               






                                           




                                             
                                        





                                               
                                        

                                       

                                             
 

                                     
                                         
 
                                         

                                           


                                             
                                             
                                            




                                                     


                        
                                                                
                    


                           














                                                                       

                          

                                                                    
                                                                                
                                                                           

                               


                                                                     


                                                  
                                                                            
                                         
                                                                             
                                                          
                                                                         
                                            


     










                                                                          
                                          
                                    
                    
                              


                                                 
                         
                            
                    
 

                                       

                                                                   



                                    
                                    
                                                  




                                                               
                                                       
                                                                
                            

                                
                                                           


                                       


                                                    
                                      

                                    
                                        

                                    
                                           
                                    

                               
                                

                          
                






                                                                             
                           
             

         
                    

                                                       
 
#include "eval.h"
#include "builtin.h"
#include "exc.h"
#include "consts.h"
#include "gc.h"
#include <cstdio>

extern Pair *empty_list;
FrameObj *eval_stack[EVAL_STACK_SIZE];

void Evaluator::add_builtin_routines() {

#define ADD_ENTRY(name, rout) \
    envt->add_binding(new SymObj(name), rout)

#define ADD_BUILTIN_PROC(name, rout) \
    ADD_ENTRY(name, new BuiltinProcObj(rout, name))

    ADD_ENTRY("if", new SpecialOptIf());
    ADD_ENTRY("lambda", new SpecialOptLambda());
    ADD_ENTRY("define", new SpecialOptDefine());
    ADD_ENTRY("set!", new SpecialOptSet());
    ADD_ENTRY("quote", new SpecialOptQuote());
    ADD_ENTRY("eval", new SpecialOptEval());
    ADD_ENTRY("and", new SpecialOptAnd());
    ADD_ENTRY("or", new SpecialOptOr());
    ADD_ENTRY("apply", new SpecialOptApply());
    ADD_ENTRY("delay", new SpecialOptDelay());
    ADD_ENTRY("force", new SpecialOptForce());

    ADD_BUILTIN_PROC("+", num_add);
    ADD_BUILTIN_PROC("-", num_sub);
    ADD_BUILTIN_PROC("*", num_mul);
    ADD_BUILTIN_PROC("/", num_div);

    ADD_BUILTIN_PROC("<", num_lt);
    ADD_BUILTIN_PROC("<=", num_le);
    ADD_BUILTIN_PROC(">", num_gt);
    ADD_BUILTIN_PROC(">=", num_ge);
    ADD_BUILTIN_PROC("=", num_eq);

    ADD_BUILTIN_PROC("exact?", num_is_exact);
    ADD_BUILTIN_PROC(