Додате сар и сдр и примени функције, поправљен баг у примени сложених функција
This commit is contained in:
		
							parent
							
								
									545aefd250
								
							
						
					
					
						commit
						7a57180cea
					
				
					 6 changed files with 65 additions and 15 deletions
				
			
		|  | @ -57,9 +57,11 @@ void init() | ||||||
| 	addSymbolInternal("ниска?", &stringQInt, 0); | 	addSymbolInternal("ниска?", &stringQInt, 0); | ||||||
| 	addSymbolInternal("карактер?", &charQInt, 0); | 	addSymbolInternal("карактер?", &charQInt, 0); | ||||||
| 	addSymbolInternal("листа?", &listQInt, 0); | 	addSymbolInternal("листа?", &listQInt, 0); | ||||||
| 	addSymbolInternal("листа", &listInt, 0); |  | ||||||
| 	addSymbolInternal("конс", &consInt, 0); | 	addSymbolInternal("конс", &consInt, 0); | ||||||
|  | 	addSymbolInternal("сар", &carInt, 0); | ||||||
|  | 	addSymbolInternal("сдр", &cdrInt, 0); | ||||||
| 	addSymbolInternal("јед?", &eqvQInt, 0); | 	addSymbolInternal("јед?", &eqvQInt, 0); | ||||||
|  | 	addSymbolInternal("примени", &applyInt, 0); | ||||||
| 
 | 
 | ||||||
| 	if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ")) | 	if (!load(DESTDIR"/usr/local/lib/cirilisp/инит.ћ")) | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
							
								
								
									
										5
									
								
								eval.c
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								eval.c
									
										
									
									
									
								
							|  | @ -129,6 +129,8 @@ int bindArgs(object parameters, object args, env newEnv) | ||||||
| 				currentArg = &CDR(*currentArg); | 				currentArg = &CDR(*currentArg); | ||||||
| 				currentParam = &CDR(*currentParam); | 				currentParam = &CDR(*currentParam); | ||||||
| 			} | 			} | ||||||
|  | 			addSymbolVariable(SYM(*currentArg), *currentParam, | ||||||
|  | 					newEnv); | ||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -146,7 +148,8 @@ object apply(object procedure, object parameters, env currentEnv) | ||||||
| 	if (PROC_TYPE(procedure) == builtinProc) | 	if (PROC_TYPE(procedure) == builtinProc) | ||||||
| 	{ | 	{ | ||||||
| 		object(*f)() = PROC_BUILTIN(procedure); | 		object(*f)() = PROC_BUILTIN(procedure); | ||||||
| 		if (f == defineInt || f == lambdaInt || f == ifInt) | 		if (f == defineInt || f == lambdaInt || f == ifInt || | ||||||
|  | 			f == applyInt) | ||||||
| 		{ | 		{ | ||||||
| 			result = f(parameters, currentEnv); | 			result = f(parameters, currentEnv); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								eval.h
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								eval.h
									
										
									
									
									
								
							|  | @ -1,3 +1,4 @@ | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
| object eval(object input, env currentEnv); | object eval(object input, env currentEnv); | ||||||
|  | object apply(object function, object parameters, env currentEnv); | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								internals.c
									
										
									
									
									
								
							
							
						
						
									
										52
									
								
								internals.c
									
										
									
									
									
								
							|  | @ -497,13 +497,6 @@ object listQInt(object parameters) | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| object listInt(object parameters) |  | ||||||
| { |  | ||||||
| 	object result; |  | ||||||
| 	result = copyObject(parameters); |  | ||||||
| 	return result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| object consInt(object parameters) | object consInt(object parameters) | ||||||
| { | { | ||||||
| 	if (listLength(parameters) != 2) | 	if (listLength(parameters) != 2) | ||||||
|  | @ -518,6 +511,32 @@ object consInt(object parameters) | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | object cellElement(object parameters, int part) | ||||||
|  | /* враћа car или cdr (сар или сдр) датог конс објекта у зависности од тога да
 | ||||||
|  |  * ли је part 0 или нешто друго (1) */ | ||||||
|  | { | ||||||
|  | 	if (listLength(parameters) != 1) | ||||||
|  | 	{ | ||||||
|  | 		SIGERR(argumentNumberError); | ||||||
|  | 	} | ||||||
|  | 	if (TYPE(CAR(parameters)) != consObject) | ||||||
|  | 	{ | ||||||
|  | 		SIGERR(typeError); | ||||||
|  | 	} | ||||||
|  | 	return !part ? copyObject(CAR(CAR(parameters))) : | ||||||
|  | 		copyObject(CDR(CAR(parameters))); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | object carInt(object parameters) | ||||||
|  | { | ||||||
|  | 	return cellElement(parameters, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | object cdrInt(object parameters) | ||||||
|  | { | ||||||
|  | 	return cellElement(parameters, 1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| object eqvQInt(object parameters) | object eqvQInt(object parameters) | ||||||
| { | { | ||||||
| 	if (listLength(parameters) != 2) | 	if (listLength(parameters) != 2) | ||||||
|  | @ -526,7 +545,7 @@ object eqvQInt(object parameters) | ||||||
| 	} | 	} | ||||||
| 	object result; | 	object result; | ||||||
| 	TYPE(result) = boolObject; | 	TYPE(result) = boolObject; | ||||||
| 	BOOL(result) = 0; | 	BOOL(result) = 1; | ||||||
| 	if (TYPE(CAR(parameters)) != TYPE(CAR(CDR(parameters)))) | 	if (TYPE(CAR(parameters)) != TYPE(CAR(CDR(parameters)))) | ||||||
| 	{ | 	{ | ||||||
| 		BOOL(result) = 0; | 		BOOL(result) = 0; | ||||||
|  | @ -571,6 +590,9 @@ object eqvQInt(object parameters) | ||||||
| 			BOOL(result) = CHR(CAR(parameters)) == | 			BOOL(result) = CHR(CAR(parameters)) == | ||||||
| 				CHR(CAR(CDR(parameters))); | 				CHR(CAR(CDR(parameters))); | ||||||
| 			break; | 			break; | ||||||
|  | 		case nilObject: | ||||||
|  | 			BOOL(result) = 1; | ||||||
|  | 			break; | ||||||
| 		case consObject: | 		case consObject: | ||||||
| 		case procedureObject: | 		case procedureObject: | ||||||
| 		default: | 		default: | ||||||
|  | @ -580,3 +602,17 @@ object eqvQInt(object parameters) | ||||||
| 	} | 	} | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | object applyInt(object parameters, env currentEnv) | ||||||
|  | { | ||||||
|  | 	if (listLength(parameters) != 2) | ||||||
|  | 	{ | ||||||
|  | 		SIGERR(argumentNumberError); | ||||||
|  | 	} | ||||||
|  | 	if (!properList(CAR(CDR(parameters))) || | ||||||
|  | 			TYPE(CAR(parameters)) != procedureObject) | ||||||
|  | 	{ | ||||||
|  | 		SIGERR(typeError); | ||||||
|  | 	} | ||||||
|  | 	return apply(CAR(parameters), CAR(CDR(parameters)), currentEnv); | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								internals.h
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								internals.h
									
										
									
									
									
								
							|  | @ -8,12 +8,12 @@ object divideInt(object parameters); | ||||||
| object exactToInexactInt(object parameters); | object exactToInexactInt(object parameters); | ||||||
| object inexactToExactInt(object parameters); | object inexactToExactInt(object parameters); | ||||||
| object quoteInt(object parameters); | object quoteInt(object parameters); | ||||||
| object lambdaInt(object parameters); | object lambdaInt(object parameters, env currentEnv); | ||||||
| object defineInt(object parameters); | object defineInt(object parameters, env currentEnv); | ||||||
| object lessInt(object parameters); | object lessInt(object parameters); | ||||||
| object greaterInt(object parameters); | object greaterInt(object parameters); | ||||||
| object eqNumInt(object parameters); | object eqNumInt(object parameters); | ||||||
| object ifInt(object parameters); | object ifInt(object parameters, env currentEnv); | ||||||
| object nilQInt(object parameters); | object nilQInt(object parameters); | ||||||
| object consQInt(object parameters); | object consQInt(object parameters); | ||||||
| object numberQInt(object parameters); | object numberQInt(object parameters); | ||||||
|  | @ -23,6 +23,8 @@ object boolQInt(object parameters); | ||||||
| object stringQInt(object parameters); | object stringQInt(object parameters); | ||||||
| object charQInt(object parameters); | object charQInt(object parameters); | ||||||
| object listQInt(object parameters); | object listQInt(object parameters); | ||||||
| object listInt(object parameters); |  | ||||||
| object consInt(object parameters); | object consInt(object parameters); | ||||||
|  | object carInt(object parameters); | ||||||
|  | object cdrInt(object parameters); | ||||||
| object eqvQInt(object parameters); | object eqvQInt(object parameters); | ||||||
|  | object applyInt(object parameters, env currentEnv); | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								инит.ћ
									
										
									
									
									
								
							
							
						
						
									
										8
									
								
								инит.ћ
									
										
									
									
									
								
							|  | @ -1,2 +1,8 @@ | ||||||
| (дефиниши (не предикат) | (дефиниши (није предикат) | ||||||
| 	(ако предикат #л #и)) | 	(ако предикат #л #и)) | ||||||
|  | 
 | ||||||
|  | (дефиниши нил ()) | ||||||
|  | 
 | ||||||
|  | (дефиниши истинито #и) (дефиниши лажно #л) | ||||||
|  | 
 | ||||||
|  | (дефиниши (листа . арг) арг) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 kappa
						kappa