📄 tmpltfun.c
字号:
SetEvaluationError(theEnv,FALSE);
/*=============================*/
/* Store the value in the slot */
/*=============================*/
newFact->theProposition.theFields[position].type =
computeResult.type;
newFact->theProposition.theFields[position].value =
computeResult.value;
}
testPtr = testPtr->nextArg;
}
/*=====================================*/
/* Copy the multifield values from the */
/* old fact that were not replaced. */
/*=====================================*/
for (i = 0; i < (int) oldFact->theProposition.multifieldLength; i++)
{
if ((newFact->theProposition.theFields[i].type == MULTIFIELD) &&
(newFact->theProposition.theFields[i].value == NULL))
{
newFact->theProposition.theFields[i].value =
CopyMultifield(theEnv,(struct multifield *) oldFact->theProposition.theFields[i].value);
}
}
/*======================================*/
/* Perform the duplicate/modify action. */
/*======================================*/
if (retractIt) EnvRetract(theEnv,oldFact);
theFact = (struct fact *) EnvAssert(theEnv,newFact);
/*========================================*/
/* The asserted fact is the return value. */
/*========================================*/
if (theFact != NULL)
{
SetpDOBegin(returnValue,1);
SetpDOEnd(returnValue,theFact->theProposition.multifieldLength);
SetpType(returnValue,FACT_ADDRESS);
SetpValue(returnValue,(void *) theFact);
}
return;
}
/****************************************************/
/* DeftemplateSlotNamesFunction: H/L access routine */
/* for the deftemplate-slot-names function. */
/****************************************************/
globle void DeftemplateSlotNamesFunction(
void *theEnv,
DATA_OBJECT *returnValue)
{
char *deftemplateName;
struct deftemplate *theDeftemplate;
/*=============================================*/
/* Set up the default return value for errors. */
/*=============================================*/
returnValue->type = SYMBOL;
returnValue->value = EnvFalseSymbol(theEnv);
/*============================================*/
/* Check for the correct number of arguments. */
/*============================================*/
if (EnvArgCountCheck(theEnv,"deftemplate-slot-names",EXACTLY,1) == -1) return;
/*=======================================*/
/* Get the reference to the deftemplate. */
/*=======================================*/
deftemplateName = GetConstructName(theEnv,"deftemplate-slot-names","deftemplate name");
if (deftemplateName == NULL) return;
theDeftemplate = (struct deftemplate *) EnvFindDeftemplate(theEnv,deftemplateName);
if (theDeftemplate == NULL)
{
CantFindItemErrorMessage(theEnv,"deftemplate",deftemplateName);
return;
}
/*=====================*/
/* Get the slot names. */
/*=====================*/
EnvDeftemplateSlotNames(theEnv,theDeftemplate,returnValue);
}
/**********************************************/
/* EnvDeftemplateSlotNames: C access routine */
/* for the deftemplate-slot-names function. */
/**********************************************/
globle void EnvDeftemplateSlotNames(
void *theEnv,
void *vTheDeftemplate,
DATA_OBJECT *returnValue)
{
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
struct multifield *theList;
struct templateSlot *theSlot;
unsigned long count;
/*===============================================*/
/* If we're dealing with an implied deftemplate, */
/* then the only slot names is "implied." */
/*===============================================*/
if (theDeftemplate->implied)
{
SetpType(returnValue,MULTIFIELD);
SetpDOBegin(returnValue,1);
SetpDOEnd(returnValue,1);
theList = (struct multifield *) EnvCreateMultifield(theEnv,(int) 1);
SetMFType(theList,1,SYMBOL);
SetMFValue(theList,1,EnvAddSymbol(theEnv,"implied"));
SetpValue(returnValue,(void *) theList);
return;
}
/*=================================*/
/* Count the number of slot names. */
/*=================================*/
for (count = 0, theSlot = theDeftemplate->slotList;
theSlot != NULL;
count++, theSlot = theSlot->next)
{ /* Do Nothing */ }
/*=============================================================*/
/* Create a multifield value in which to store the slot names. */
/*=============================================================*/
SetpType(returnValue,MULTIFIELD);
SetpDOBegin(returnValue,1);
SetpDOEnd(returnValue,(long) count);
theList = (struct multifield *) EnvCreateMultifield(theEnv,count);
SetpValue(returnValue,(void *) theList);
/*===============================================*/
/* Store the slot names in the multifield value. */
/*===============================================*/
for (count = 1, theSlot = theDeftemplate->slotList;
theSlot != NULL;
count++, theSlot = theSlot->next)
{
SetMFType(theList,count,SYMBOL);
SetMFValue(theList,count,theSlot->slotName);
}
}
/*******************************************************/
/* DeftemplateSlotDefaultPFunction: H/L access routine */
/* for the deftemplate-slot-defaultp function. */
/*******************************************************/
globle void *DeftemplateSlotDefaultPFunction(
void *theEnv)
{
struct deftemplate *theDeftemplate;
SYMBOL_HN *slotName;
int defaultType;
/*===================================================*/
/* Retrieve the deftemplate and slot name arguments. */
/*===================================================*/
slotName = CheckDeftemplateAndSlotArguments(theEnv,"deftemplate-slot-existp",&theDeftemplate);
if (slotName == NULL)
{ return(EnvFalseSymbol(theEnv)); }
/*===============================*/
/* Does the slot have a default? */
/*===============================*/
defaultType = EnvDeftemplateSlotDefaultP(theEnv,theDeftemplate,ValueToString(slotName));
if (defaultType == STATIC_DEFAULT)
{ return(EnvAddSymbol(theEnv,"static")); }
else if (defaultType == DYNAMIC_DEFAULT)
{ return(EnvAddSymbol(theEnv,"dynamic")); }
return(EnvFalseSymbol(theEnv));
}
/*************************************************/
/* EnvDeftemplateSlotDefaultP: C access routine */
/* for the deftemplate-slot-defaultp function. */
/*************************************************/
globle int EnvDeftemplateSlotDefaultP(
void *theEnv,
void *vTheDeftemplate,
char *slotName)
{
short position;
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
struct templateSlot *theSlot;
/*==================================================*/
/* Make sure the slot exists (the symbol implied is */
/* used for the implied slot of an ordered fact). */
/*==================================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") == 0)
{
return(STATIC_DEFAULT);
}
else
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(NO_DEFAULT);
}
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position)) == NULL)
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(NO_DEFAULT);
}
/*======================================*/
/* Return the default type of the slot. */
/*======================================*/
if (theSlot->noDefault)
{ return(NO_DEFAULT); }
else if (theSlot->defaultDynamic)
{ return(DYNAMIC_DEFAULT); }
return(STATIC_DEFAULT);
}
/*************************************************************/
/* DeftemplateSlotDefaultValueFunction: H/L access routine */
/* for the deftemplate-slot-default-value function. */
/*************************************************************/
globle void DeftemplateSlotDefaultValueFunction(
void *theEnv,
DATA_OBJECT_PTR theValue)
{
struct deftemplate *theDeftemplate;
SYMBOL_HN *slotName;
/*===================================================*/
/* Retrieve the deftemplate and slot name arguments. */
/*===================================================*/
slotName = CheckDeftemplateAndSlotArguments(theEnv,"deftemplate-slot-default-value",&theDeftemplate);
if (slotName == NULL)
{
theValue->type = SYMBOL;
theValue->value = EnvFalseSymbol(theEnv);
return;
}
/*=========================================*/
/* Get the deftemplate slot default value. */
/*=========================================*/
EnvDeftemplateSlotDefaultValue(theEnv,theDeftemplate,ValueToString(slotName),theValue);
}
/******************************************************/
/* EnvDeftemplateSlotDefaultValue: C access routine */
/* for the deftemplate-slot-default-value function. */
/******************************************************/
globle intBool EnvDeftemplateSlotDefaultValue(
void *theEnv,
void *vTheDeftemplate,
char *slotName,
DATA_OBJECT_PTR theValue)
{
short position;
struct deftemplate *theDeftemplate = (struct deftemplate *) vTheDeftemplate;
struct templateSlot *theSlot;
DATA_OBJECT tempDO;
/*=============================================*/
/* Set up the default return value for errors. */
/*=============================================*/
SetpType(theValue,SYMBOL);
SetpValue(theValue,EnvFalseSymbol(theEnv));
/*==================================================*/
/* Make sure the slot exists (the symbol implied is */
/* used for the implied slot of an ordered fact). */
/*==================================================*/
if (theDeftemplate->implied)
{
if (strcmp(slotName,"implied") == 0)
{
theValue->type = MULTIFIELD;
theValue->value = EnvCreateMultifield(theEnv,0L);
theValue->begin = 1;
theValue->end = 0;
return(TRUE);
}
else
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
}
/*============================================*/
/* Otherwise search for the slot name in the */
/* list of slots defined for the deftemplate. */
/*============================================*/
else if ((theSlot = FindSlot(theDeftemplate,(SYMBOL_HN *) EnvAddSymbol(theEnv,slotName),&position)) == NULL)
{
SetEvaluationError(theEnv,TRUE);
InvalidDeftemplateSlotMessage(theEnv,slotName,
ValueToString(theDeftemplate->header.name),FALSE);
return(FALSE);
}
/*=======================================*/
/* Return the default value of the slot. */
/*=======================================*/
if (theSlot->noDefault)
{
SetpType(theValue,SYMBOL);
SetpValue(theValue,EnvAddSymbol(theEnv,"?NONE"));
}
else if (DeftemplateSlotDefault(theEnv,theDeftemplate,theSlot,&tempDO,TRUE))
{
SetpDOBegin(theValue,GetDOBegin(tempDO));
SetpDOEnd(theValue,GetDOEnd(tempDO));
SetpType(theValue,tempDO.type);
SetpValue(theValue,tempDO.value);
}
else
{ return (FALSE); }
return(TRUE);
}
/**********************************************************/
/* DeftemplateSlotCardinalityFunction: H/L access routine */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -