added a new special word and and or. compiler yet to be enhanced
This commit is contained in:
		
							
								
								
									
										19
									
								
								lib/comp.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								lib/comp.c
									
									
									
									
									
								
							@ -650,6 +650,17 @@ enum
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* ========================================================================= */
 | 
					/* ========================================================================= */
 | 
				
			||||||
 | 
					static int compile_and (hcl_t* hcl, hcl_oop_t src)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						hcl_seterrbfmt (hcl, HCL_ENOIMPL, "and not implemented");
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int compile_or (hcl_t* hcl, hcl_oop_t src)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						hcl_seterrbfmt (hcl, HCL_ENOIMPL, "or not implemented");
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int compile_break (hcl_t* hcl, hcl_oop_t src)
 | 
					static int compile_break (hcl_t* hcl, hcl_oop_t src)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1301,6 +1312,10 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_oop_t obj)
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		switch (syncode)
 | 
							switch (syncode)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
								case HCL_SYNCODE_AND:
 | 
				
			||||||
 | 
									if (compile_and(hcl, obj) <= -1) return -1;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			case HCL_SYNCODE_BREAK:
 | 
								case HCL_SYNCODE_BREAK:
 | 
				
			||||||
				/* break */
 | 
									/* break */
 | 
				
			||||||
				if (compile_break(hcl, obj) <= -1) return -1;
 | 
									if (compile_break(hcl, obj) <= -1) return -1;
 | 
				
			||||||
@ -1331,6 +1346,10 @@ static int compile_cons_xlist_expression (hcl_t* hcl, hcl_oop_t obj)
 | 
				
			|||||||
				if (compile_lambda(hcl, obj, 0) <= -1) return -1;
 | 
									if (compile_lambda(hcl, obj, 0) <= -1) return -1;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								case HCL_SYNCODE_OR:
 | 
				
			||||||
 | 
									if (compile_or(hcl, obj) <= -1) return -1;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			case HCL_SYNCODE_SET:
 | 
								case HCL_SYNCODE_SET:
 | 
				
			||||||
				/* (set x 10) 
 | 
									/* (set x 10) 
 | 
				
			||||||
				 * (set x (lambda (x y) (+ x y)) */
 | 
									 * (set x (lambda (x y) (+ x y)) */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								lib/gc.c
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								lib/gc.c
									
									
									
									
									
								
							@ -34,7 +34,7 @@ static struct
 | 
				
			|||||||
	hcl_oow_t  offset;
 | 
						hcl_oow_t  offset;
 | 
				
			||||||
} syminfo[] =
 | 
					} syminfo[] =
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	
 | 
						{  3, { 'a','n','d' },                 HCL_SYNCODE_AND,     HCL_OFFSETOF(hcl_t,_and)  },
 | 
				
			||||||
	{  5, { 'b','r','e','a','k' },         HCL_SYNCODE_BREAK,   HCL_OFFSETOF(hcl_t,_break)  },
 | 
						{  5, { 'b','r','e','a','k' },         HCL_SYNCODE_BREAK,   HCL_OFFSETOF(hcl_t,_break)  },
 | 
				
			||||||
	{  5, { 'd','e','f','u','n' },         HCL_SYNCODE_DEFUN,   HCL_OFFSETOF(hcl_t,_defun)  },
 | 
						{  5, { 'd','e','f','u','n' },         HCL_SYNCODE_DEFUN,   HCL_OFFSETOF(hcl_t,_defun)  },
 | 
				
			||||||
	{  2, { 'd','o' },                     HCL_SYNCODE_DO,      HCL_OFFSETOF(hcl_t,_do)  },
 | 
						{  2, { 'd','o' },                     HCL_SYNCODE_DO,      HCL_OFFSETOF(hcl_t,_do)  },
 | 
				
			||||||
@ -42,6 +42,7 @@ static struct
 | 
				
			|||||||
	{  4, { 'e','l','s','e' },             HCL_SYNCODE_ELSE,    HCL_OFFSETOF(hcl_t,_else)   },
 | 
						{  4, { 'e','l','s','e' },             HCL_SYNCODE_ELSE,    HCL_OFFSETOF(hcl_t,_else)   },
 | 
				
			||||||
	{  2, { 'i','f' },                     HCL_SYNCODE_IF,      HCL_OFFSETOF(hcl_t,_if)     },
 | 
						{  2, { 'i','f' },                     HCL_SYNCODE_IF,      HCL_OFFSETOF(hcl_t,_if)     },
 | 
				
			||||||
	{  6, { 'l','a','m','b','d','a' },     HCL_SYNCODE_LAMBDA,  HCL_OFFSETOF(hcl_t,_lambda) },
 | 
						{  6, { 'l','a','m','b','d','a' },     HCL_SYNCODE_LAMBDA,  HCL_OFFSETOF(hcl_t,_lambda) },
 | 
				
			||||||
 | 
						{  2, { 'o','r' },                     HCL_SYNCODE_OR,      HCL_OFFSETOF(hcl_t,_or)  },
 | 
				
			||||||
	{  6, { 'r','e','t','u','r','n'},      HCL_SYNCODE_RETURN,  HCL_OFFSETOF(hcl_t,_return) },
 | 
						{  6, { 'r','e','t','u','r','n'},      HCL_SYNCODE_RETURN,  HCL_OFFSETOF(hcl_t,_return) },
 | 
				
			||||||
	{  3, { 's','e','t' },                 HCL_SYNCODE_SET,     HCL_OFFSETOF(hcl_t,_set)    },
 | 
						{  3, { 's','e','t' },                 HCL_SYNCODE_SET,     HCL_OFFSETOF(hcl_t,_set)    },
 | 
				
			||||||
	{  5, { 'u','n','t','i','l' },         HCL_SYNCODE_UNTIL,   HCL_OFFSETOF(hcl_t,_until)  },
 | 
						{  5, { 'u','n','t','i','l' },         HCL_SYNCODE_UNTIL,   HCL_OFFSETOF(hcl_t,_until)  },
 | 
				
			||||||
 | 
				
			|||||||
@ -1004,13 +1004,15 @@ struct hcl_t
 | 
				
			|||||||
	hcl_oop_t _true;
 | 
						hcl_oop_t _true;
 | 
				
			||||||
	hcl_oop_t _false;
 | 
						hcl_oop_t _false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						hcl_oop_t _and;    /* symbol */
 | 
				
			||||||
	hcl_oop_t _break;  /* symbol */
 | 
						hcl_oop_t _break;  /* symbol */
 | 
				
			||||||
	hcl_oop_t _defun;  /* symbol */
 | 
						hcl_oop_t _defun;  /* symbol */
 | 
				
			||||||
	hcl_oop_t _do;  /* symbol */
 | 
						hcl_oop_t _do;     /* symbol */
 | 
				
			||||||
	hcl_oop_t _elif;   /* symbol */
 | 
						hcl_oop_t _elif;   /* symbol */
 | 
				
			||||||
	hcl_oop_t _else;   /* symbol */
 | 
						hcl_oop_t _else;   /* symbol */
 | 
				
			||||||
	hcl_oop_t _if;     /* symbol */
 | 
						hcl_oop_t _if;     /* symbol */
 | 
				
			||||||
	hcl_oop_t _lambda; /* symbol */
 | 
						hcl_oop_t _lambda; /* symbol */
 | 
				
			||||||
 | 
						hcl_oop_t _or;     /* symbol */
 | 
				
			||||||
	hcl_oop_t _return; /* symbol */
 | 
						hcl_oop_t _return; /* symbol */
 | 
				
			||||||
	hcl_oop_t _set;    /* symbol */
 | 
						hcl_oop_t _set;    /* symbol */
 | 
				
			||||||
	hcl_oop_t _until;  /* symbol */
 | 
						hcl_oop_t _until;  /* symbol */
 | 
				
			||||||
@ -1269,13 +1271,15 @@ typedef enum hcl_brand_t hcl_brand_t;
 | 
				
			|||||||
enum hcl_syncode_t
 | 
					enum hcl_syncode_t
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* SYNCODE 0 means it's not a syncode object. so it begins with 1 */
 | 
						/* SYNCODE 0 means it's not a syncode object. so it begins with 1 */
 | 
				
			||||||
	HCL_SYNCODE_BREAK = 1,
 | 
						HCL_SYNCODE_AND = 1,
 | 
				
			||||||
 | 
						HCL_SYNCODE_BREAK,
 | 
				
			||||||
	HCL_SYNCODE_DEFUN,
 | 
						HCL_SYNCODE_DEFUN,
 | 
				
			||||||
	HCL_SYNCODE_DO,
 | 
						HCL_SYNCODE_DO,
 | 
				
			||||||
	HCL_SYNCODE_ELIF,
 | 
						HCL_SYNCODE_ELIF,
 | 
				
			||||||
	HCL_SYNCODE_ELSE,
 | 
						HCL_SYNCODE_ELSE,
 | 
				
			||||||
	HCL_SYNCODE_IF,
 | 
						HCL_SYNCODE_IF,
 | 
				
			||||||
	HCL_SYNCODE_LAMBDA,
 | 
						HCL_SYNCODE_LAMBDA,
 | 
				
			||||||
 | 
						HCL_SYNCODE_OR,
 | 
				
			||||||
	HCL_SYNCODE_RETURN,
 | 
						HCL_SYNCODE_RETURN,
 | 
				
			||||||
	HCL_SYNCODE_SET,
 | 
						HCL_SYNCODE_SET,
 | 
				
			||||||
	HCL_SYNCODE_UNTIL,
 | 
						HCL_SYNCODE_UNTIL,
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user