fix bug by adding count to all types.
This commit is contained in:
		
							parent
							
								
									28f94b2ee1
								
							
						
					
					
						commit
						3eb174aedf
					
				
							
								
								
									
										2
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								makefile
									
									
									
									
									
								
							|  | @ -6,7 +6,7 @@ | |||
| # make uninstall
 | ||||
| 
 | ||||
| ## C compiler
 | ||||
| CC=gcc # much faster compilation than gcc | ||||
| CC=tcc # much faster compilation than gcc | ||||
| COMPILER_FLAGS=#-g3 -Wall -Wextra -Wconversion -Wdouble-promotion -Wno-unused-parameter -Wno-unused-function -Wno-sign-conversion -fsanitize=undefined  | ||||
| # exclude: -fsanitize-trap, because I'm using an old version of gcc and couldn't bother getting a new one.
 | ||||
| ## ^ from <https://nullprogram.com/blog/2023/04/29/>
 | ||||
|  |  | |||
							
								
								
									
										30
									
								
								src/mumble.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/mumble.c
									
									
									
									
									
								
							|  | @ -38,6 +38,7 @@ lispval* lispval_num(double x) | |||
| { | ||||
|     lispval* v = malloc(sizeof(lispval)); | ||||
|     v->type = LISPVAL_NUM; | ||||
|     v->count = 0; | ||||
|     v->num = x; | ||||
|     return v; | ||||
| } | ||||
|  | @ -46,6 +47,7 @@ lispval* lispval_err(char* message) | |||
| { | ||||
|     lispval* v = malloc(sizeof(lispval)); | ||||
|     v->type = LISPVAL_ERR; | ||||
|     v->count = 0; | ||||
|     v->err = malloc(strlen(message) + 1); | ||||
|     strcpy(v->err, message); | ||||
|     return v; | ||||
|  | @ -55,6 +57,7 @@ lispval* lispval_sym(char* symbol) | |||
| { | ||||
|     lispval* v = malloc(sizeof(lispval)); | ||||
|     v->type = LISPVAL_SYM; | ||||
|     v->count = 0; | ||||
|     v->sym = malloc(strlen(symbol) + 1); | ||||
|     strcpy(v->sym, symbol); | ||||
|     return v; | ||||
|  | @ -267,30 +270,45 @@ void print_ast(mpc_ast_t* ast, int indent_level) | |||
| lispval* clone_lispval(lispval* old) | ||||
| { | ||||
| 	  lispval* new; | ||||
| 		 | ||||
| 		print_lispval_tree(old, 0); | ||||
| 		printf("\nCloning lispval of type %d\n", old->type); | ||||
| 	  switch(old->type){ | ||||
|     case LISPVAL_NUM: | ||||
| 				printf("\n1"); | ||||
| 				printf("\nnum: %f", old->num); | ||||
| 				print_lispval_tree(old, 0); | ||||
| 			  new = lispval_num(old->num); | ||||
| 				printf("\nAssigned new"); | ||||
| 				printf("\n count: %i", old->count); | ||||
|         break; | ||||
|     case LISPVAL_ERR: | ||||
| 				printf("2"); | ||||
|         new = lispval_err(old->err); | ||||
|         break; | ||||
|     case LISPVAL_SYM: | ||||
| 				printf("3"); | ||||
|         new = lispval_sym(old->sym); | ||||
|         break; | ||||
|     case LISPVAL_SEXPR: | ||||
| 				printf("4"); | ||||
| 				new = lispval_sexpr(); | ||||
| 				break;  | ||||
|     case LISPVAL_QEXPR: | ||||
| 				printf("\n5"); | ||||
| 				new = lispval_qexpr(); | ||||
|         break; | ||||
|     default:  | ||||
| 				return lispval_err("Error: Cloning element of unknown type."); | ||||
| 		} | ||||
| 		 | ||||
| 		printf("\n6"); | ||||
| 		if(old->count > 0){ | ||||
| 			for (int i = 0; i < old->count; i++) { | ||||
| 					lispval* temp_child = old->cell[i]; | ||||
| 					lispval* child = clone_lispval(temp_child); | ||||
| 					lispval_append_child(new, child); | ||||
| 			} | ||||
| 		} | ||||
|     return new; | ||||
| } | ||||
| 
 | ||||
|  | @ -319,13 +337,17 @@ lispval* take_lispval(lispval* v, int i) | |||
| // Operations
 | ||||
| // Ops for q-expressions
 | ||||
| lispval* builtin_head(lispval* v){ | ||||
|   printf("Entering builtin_head with v->count = %d and v->cell[0]->type = %d\n", v->count, v->cell[0]->type); | ||||
| 	// head { 1 2 3 }
 | ||||
| 	// But actually, that gets processd into head ({ 1 2 3 }), hence the v->cell[0]->cell[0];
 | ||||
| 	LISPVAL_ASSERT(v->count ==1, "Error: function head passed too many arguments"); | ||||
| 	LISPVAL_ASSERT(v->count == 1, "Error: function head passed too many arguments"); | ||||
| 	LISPVAL_ASSERT(v->cell[0]->type == LISPVAL_QEXPR, "Error: Argument passed to head is not a q-expr, i.e., a bracketed list."); | ||||
|   LISPVAL_ASSERT(v->cell[0]->count != 0, "Error: Argument passed to head is {}"); | ||||
|   printf("Passed assertions, v->cell[0]->count = %d\n", v->cell[0]->count); | ||||
|   // print_lispval_parenthesis(v);
 | ||||
| 	lispval* result = clone_lispval(v->cell[0]->cell[0]);  | ||||
| 	print_lispval_parenthesis(v->cell[0]); | ||||
| 	lispval* result = clone_lispval(v->cell[0]);  | ||||
|   printf("Cloned lispval, result->type = %d\n", result->type); | ||||
| 	// lispval* result = pop_lispval(v->cell[0], 0); 
 | ||||
|   // ^ also possible
 | ||||
| 	// A bit unclear. Pop seems like it would depend on the size of the array. clone depends on the sie of head.
 | ||||
|  | @ -470,6 +492,8 @@ lispval* builtin_functions(char* func, lispval* v) | |||
| // Evaluate the lispval
 | ||||
| lispval* evaluate_lispval(lispval* l) | ||||
| { | ||||
| 		// Check if this is an s-expression
 | ||||
| 		if(l->type != LISPVAL_SEXPR) return l; | ||||
|     // Evaluate the children if needed
 | ||||
|     for (int i = 0; i < l->count; i++) { | ||||
|         if (l->cell[i]->type == LISPVAL_SEXPR) { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user