This commit is contained in:
Vitor Santos Costa 2019-02-27 04:23:21 +00:00
parent 5d7c6378e7
commit 2d65d0463c
30 changed files with 527 additions and 424 deletions

View File

@ -2539,7 +2539,7 @@ static Int
// if (!pe) pe = Yap_get_pred(t1, Deref(ARG2), "system_predicate"); // if (!pe) pe = Yap_get_pred(t1, Deref(ARG2), "system_predicate");
if (EndOfPAEntr(pe)) if (EndOfPAEntr(pe))
return FALSE; return FALSE;
return (pe->ModuleOfPred == 0); return (pe->ModuleOfPred == 0 || pe-> PredFlags & UserCPredFlag);
// return true; // return true;
// PELOCK(27, pe); // PELOCK(27, pe);
// out = (pe->PredFlags & SystemPredFlags); // out = (pe->PredFlags & SystemPredFlags);

View File

@ -107,6 +107,9 @@ if (strcmp(ks, q) == 0 ) \
if (i->k == NULL) return TermNil; \ if (i->k == NULL) return TermNil; \
Term t; if((t = Yap_BufferToTerm(i->k, TermNil) ) == 0 ) return TermNil; return t; } Term t; if((t = Yap_BufferToTerm(i->k, TermNil) ) == 0 ) return TermNil; return t; }
static yap_error_descriptor_t *CopyException(yap_error_descriptor_t *t);
static Term queryErr(const char *q, yap_error_descriptor_t *i) { static Term queryErr(const char *q, yap_error_descriptor_t *i) {
query_key_i(errorNo, "errorNo", q, i); query_key_i(errorNo, "errorNo", q, i);
query_key_i(errorClass, "errorClass", q, i); query_key_i(errorClass, "errorClass", q, i);
@ -332,13 +335,15 @@ bool Yap_PrintWarning(Term twarning) {
CACHE_REGS CACHE_REGS
PredEntry *pred = RepPredProp(PredPropByFunc( PredEntry *pred = RepPredProp(PredPropByFunc(
FunctorPrintMessage, PROLOG_MODULE)); // PROCEDURE_print_message2; FunctorPrintMessage, PROLOG_MODULE)); // PROCEDURE_print_message2;
if (twarning)
__android_log_print(ANDROID_LOG_INFO, "YAPDroid ", " warning(%s)", __android_log_print(ANDROID_LOG_INFO, "YAPDroid ", " warning(%s)",
Yap_TermToBuffer(twarning, Quote_illegal_f | Ignore_ops_f | Ignore_cyclics_f)); Yap_TermToBuffer(twarning, Quote_illegal_f | Ignore_ops_f | Ignore_cyclics_f));
Term cmod = (CurrentModule == PROLOG_MODULE ? TermProlog : CurrentModule); Term cmod = (CurrentModule == PROLOG_MODULE ? TermProlog : CurrentModule);
bool rc; bool rc;
Term ts[2], err; Term ts[2], err;
if (LOCAL_PrologMode & InErrorMode && LOCAL_ActiveError &&
if (twarning && LOCAL_PrologMode & InErrorMode &&
LOCAL_ActiveError->errorClass != WARNING && LOCAL_ActiveError->errorClass != WARNING &&
(err = LOCAL_ActiveError->errorNo) ) { (err = LOCAL_ActiveError->errorNo) ) {
fprintf(stderr, "%% Warning %s while processing error: %s %s\n", fprintf(stderr, "%% Warning %s while processing error: %s %s\n",
@ -352,12 +357,16 @@ bool Yap_PrintWarning(Term twarning) {
fprintf(stderr, "%s:%ld/* d:%d warning */:\n", fprintf(stderr, "%s:%ld/* d:%d warning */:\n",
LOCAL_ActiveError->errorFile, LOCAL_ActiveError->errorFile,
LOCAL_ActiveError->errorLine, 0 ); LOCAL_ActiveError->errorLine, 0 );
if (!twarning)
twarning = Yap_MkFullError();
Yap_DebugPlWriteln(twarning); Yap_DebugPlWriteln(twarning);
LOCAL_DoingUndefp = false; LOCAL_DoingUndefp = false;
LOCAL_PrologMode &= ~InErrorMode; LOCAL_PrologMode &= ~InErrorMode;
CurrentModule = cmod; CurrentModule = cmod;
return false; return false;
} }
if (!twarning)
twarning = Yap_MkFullError();
ts[1] = twarning; ts[1] = twarning;
ts[0] = MkAtomTerm(AtomWarning); ts[0] = MkAtomTerm(AtomWarning);
rc = Yap_execute_pred(pred, ts, true PASS_REGS); rc = Yap_execute_pred(pred, ts, true PASS_REGS);
@ -656,7 +665,7 @@ void Yap_ThrowExistingError(void) {
Term Yap_MkFullError(void) Term Yap_MkFullError(void)
{ {
yap_error_descriptor_t *i = Yap_local.ActiveError; yap_error_descriptor_t *i = CopyException(Yap_local.ActiveError);
i->errorAsText = Yap_errorName( i->errorNo ); i->errorAsText = Yap_errorName( i->errorNo );
i->errorClass = Yap_errorClass( i-> errorNo ); i->errorClass = Yap_errorClass( i-> errorNo );
i->classAsText = Yap_errorClassName(i->errorClass); i->classAsText = Yap_errorClassName(i->errorClass);
@ -880,7 +889,8 @@ yamop *Yap_Error__(bool throw, const char *file, const char *function,
if (LOCAL_DoingUndefp) { if (LOCAL_DoingUndefp) {
LOCAL_DoingUndefp = false; LOCAL_DoingUndefp = false;
LOCAL_Signals = 0; LOCAL_Signals = 0;
Yap_PrintWarning(MkErrorTerm(Yap_GetException(LOCAL_ActiveError))); yap_error_descriptor_t *co = CopyException( LOCAL_ActiveError );
Yap_PrintWarning(MkErrorTerm(Yap_GetException( co )));
return P; return P;
} }
// LOCAL_ActiveError = Yap_GetException(); // LOCAL_ActiveError = Yap_GetException();
@ -1012,6 +1022,7 @@ bool Yap_ResetException(yap_error_descriptor_t *i) {
static Int reset_exception(USES_REGS1) { return Yap_ResetException(worker_id); } static Int reset_exception(USES_REGS1) { return Yap_ResetException(worker_id); }
Term MkErrorTerm(yap_error_descriptor_t *t) { Term MkErrorTerm(yap_error_descriptor_t *t) {
if (t->errorClass == EVENT) if (t->errorClass == EVENT)
return t->errorRawTerm; return t->errorRawTerm;
@ -1023,6 +1034,13 @@ Term MkErrorTerm(yap_error_descriptor_t *t) {
err2list(t)); err2list(t));
} }
static yap_error_descriptor_t *CopyException(yap_error_descriptor_t *t) {
yap_error_descriptor_t *n = malloc( sizeof( yap_error_descriptor_t ));
memcpy(n, t, sizeof( yap_error_descriptor_t ) );
return n;
}
static Int read_exception(USES_REGS1) { static Int read_exception(USES_REGS1) {
yap_error_descriptor_t *t = AddressOfTerm(Deref(ARG1)); yap_error_descriptor_t *t = AddressOfTerm(Deref(ARG1));
Term rc = MkErrorTerm(t); Term rc = MkErrorTerm(t);

View File

@ -1065,7 +1065,7 @@ static Int _user_expand_goal(USES_REGS1) {
ARG1 = g; ARG1 = g;
if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorGoalExpansion2, cmod))) && if ((pe = RepPredProp(Yap_GetPredPropByFunc(FunctorGoalExpansion2, cmod))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE && pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, true PASS_REGS)) { Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true , omod, sl, creeping); return complete_ge(true , omod, sl, creeping);
} }
/* system:goal_expansion(A,B) */ /* system:goal_expansion(A,B) */
@ -1076,7 +1076,7 @@ static Int _user_expand_goal(USES_REGS1) {
if ((pe = RepPredProp( if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) && Yap_GetPredPropByFunc(FunctorGoalExpansion2, SYSTEM_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE && pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, true PASS_REGS)) { Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping); return complete_ge(true, omod, sl, creeping);
} }
Yap_ResetException(NULL); Yap_ResetException(NULL);
@ -1087,7 +1087,7 @@ static Int _user_expand_goal(USES_REGS1) {
if ((pe = RepPredProp( if ((pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) && Yap_GetPredPropByFunc(FunctorGoalExpansion, USER_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE && pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, true PASS_REGS)) { Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping); return complete_ge(true, omod, sl, creeping);
} }
Yap_ResetException(NULL); Yap_ResetException(NULL);
@ -1101,7 +1101,7 @@ static Int _user_expand_goal(USES_REGS1) {
(pe = RepPredProp( (pe = RepPredProp(
Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) && Yap_GetPredPropByFunc(FunctorGoalExpansion2, USER_MODULE))) &&
pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE && pe->OpcodeOfPred != FAIL_OPCODE && pe->OpcodeOfPred != UNDEF_OPCODE &&
Yap_execute_pred(pe, NULL, true PASS_REGS)) { Yap_execute_pred(pe, NULL, false PASS_REGS)) {
return complete_ge(true, omod, sl, creeping); return complete_ge(true, omod, sl, creeping);
} }
Yap_ResetException(NULL); Yap_ResetException(NULL);
@ -1164,6 +1164,12 @@ restart_exec:
} else if (IsAtomTerm(t)) { } else if (IsAtomTerm(t)) {
Atom a = AtomOfTerm(t); Atom a = AtomOfTerm(t);
pe = PredPropByAtom(a, mod); pe = PredPropByAtom(a, mod);
} else if (IsPairTerm(t)) {
Term ts[2];
ts[0] = t;
ts[1] = (CurrentModule == 0 ? TermProlog : CurrentModule);
t = Yap_MkApplTerm(FunctorCsult, 2, ts);
goto restart_exec;
} else if (IsApplTerm(t)) { } else if (IsApplTerm(t)) {
register Functor f = FunctorOfTerm(t); register Functor f = FunctorOfTerm(t);
register unsigned int i; register unsigned int i;
@ -1207,8 +1213,9 @@ restart_exec:
#endif #endif
} }
} else { } else {
Yap_Error(TYPE_ERROR_CALLABLE, t, "call/1"); //Yap_Error(TYPE_ERROR_CALLABLE, t, "call/1");
return false; //return false;
return CallMetaCall(t, mod);
} }
/* N = arity; */ /* N = arity; */
/* call may not define new system predicates!! */ /* call may not define new system predicates!! */
@ -1264,8 +1271,7 @@ static Int creep_step(USES_REGS1) { /* '$execute_nonstop'(Goal,Mod)
#endif #endif
} }
} else { } else {
Yap_Error(TYPE_ERROR_CALLABLE, t, "call/1"); return CallMetaCall(t, mod);
return FALSE;
} }
/* N = arity; */ /* N = arity; */
/* call may not define new system predicates!! */ /* call may not define new system predicates!! */

View File

@ -89,10 +89,10 @@ typedef struct non_single_struct_t {
CELL *pt0, *pt0_end; \ CELL *pt0, *pt0_end; \
size_t auxsz = 1024 * sizeof(struct non_single_struct_t);\ size_t auxsz = 1024 * sizeof(struct non_single_struct_t);\
struct non_single_struct_t *to_visit0=NULL, *to_visit,* to_visit_max;\ struct non_single_struct_t *to_visit0=NULL, *to_visit,* to_visit_max;\
to_visit0 = Realloc(to_visit0,auxsz); \
CELL *InitialH = HR;\ CELL *InitialH = HR;\
tr_fr_ptr TR0 = TR;\ tr_fr_ptr TR0 = TR;\
reset:\ reset:\
to_visit0 = Realloc(to_visit0,auxsz); \
pt0 = pt0_; pt0_end = pt0_end_; \ pt0 = pt0_; pt0_end = pt0_end_; \
to_visit = to_visit0, \ to_visit = to_visit0, \
to_visit_max = to_visit + auxsz/sizeof(struct non_single_struct_t);\ to_visit_max = to_visit + auxsz/sizeof(struct non_single_struct_t);\
@ -306,8 +306,10 @@ static int cycles_in_complex_term( CELL *pt0_, CELL *pt0_end_ USES_REGS) {
reset: reset:
pt0 = pt0_, pt0_end = pt0_end_; pt0 = pt0_, pt0_end = pt0_end_;
to_visit= to_visit0, to_visit0 = Realloc(to_visit0,auxsz);
to_visit= to_visit0;
to_visit_max = to_visit0 + auxsz/sizeof(struct non_single_struct_t); to_visit_max = to_visit0 + auxsz/sizeof(struct non_single_struct_t);
auxsz *= 2;
int rc = 0; int rc = 0;
CELL *ptf; CELL *ptf;
ptf = HR; ptf = HR;
@ -811,8 +813,8 @@ static Term new_vars_in_complex_term(
CELL output = TermNil; CELL output = TermNil;
{ {
tr_fr_ptr myTR0 = TR; tr_fr_ptr myTR0 = TR;
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
int lvl = push_text_stack(); int lvl = push_text_stack();
while (!IsVarTerm(inp) && IsPairTerm(inp)) {
Term t = HeadOfTerm(inp); Term t = HeadOfTerm(inp);
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
n++; n++;
@ -827,6 +829,7 @@ static Term new_vars_in_complex_term(
} }
inp = TailOfTerm(inp); inp = TailOfTerm(inp);
} }
pop_text_stack(lvl);
} }
WALK_COMPLEX_TERM(); WALK_COMPLEX_TERM();
output = MkPairTerm((CELL)ptd0, output); output = MkPairTerm((CELL)ptd0, output);
@ -958,14 +961,14 @@ static Int free_variables_in_term(
Term out; Term out;
Term t, t0; Term t, t0;
Term found_module = 0L; Term found_module = 0L;
Term vlist = TermNil; Term bounds = TermNil;
t = t0 = Deref(ARG1); t = t0 = Deref(ARG1);
Int delta = 0; Int delta = 0;
while (!IsVarTerm(t) && IsApplTerm(t)) { while (!IsVarTerm(t) && IsApplTerm(t)) {
Functor f = FunctorOfTerm(t); Functor f = FunctorOfTerm(t);
if (f == FunctorHat) { if (f == FunctorHat) {
vlist = Yap_TermAddVariables(ArgOfTerm(1,t), vlist PASS_REGS); bounds = MkPairTerm(ArgOfTerm(1,t),bounds);
} else if (f == FunctorModule) { } else if (f == FunctorModule) {
found_module = ArgOfTerm(1, t); found_module = ArgOfTerm(1, t);
} else if (f == FunctorCall) { } else if (f == FunctorCall) {
@ -981,7 +984,7 @@ static Int free_variables_in_term(
if (IsPrimitiveTerm(t)) if (IsPrimitiveTerm(t))
out = TermNil; out = TermNil;
else { else {
out = new_vars_in_complex_term(&(t)-1, &(t), vlist PASS_REGS); out = new_vars_in_complex_term(&(t)-1, &(t), Yap_TermVariables(bounds, 3) PASS_REGS);
} }
if (found_module && t != t0) { if (found_module && t != t0) {

View File

@ -152,19 +152,20 @@ clean_complex_tr(tr_fr_ptr TR0 USES_REGS) {
#define expand_stack(S0,SP,SF,TYPE) \ #define expand_stack(S0,SP,SF,TYPE) \
{ size_t sz = SF-S0, used = SP-S0; \ { size_t sz = SF-S0, used = SP-S0; \
S0 = Realxbloc(S0, (1024+sz)*sizeof(TYPE) PASS_REGS); \ S0 = Realloc(S0, (1024+sz)*sizeof(TYPE) PASS_REGS); \
SP = S0+used; SF = S0+sz; } SP = S0+used; SF = S0+sz; }
#define MIN_ARENA_SIZE (1048L) #define MIN_ARENA_SIZE (1048L)
int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end, int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
bool share, Term *split, bool copy_att_vars, CELL *ptf, bool share, bool copy_att_vars, CELL *ptf,
CELL *HLow USES_REGS) { CELL *HLow USES_REGS) {
// fprintf(stderr,"+++++++++\n"); // fprintf(stderr,"+++++++++\n");
//CELL *x = pt0; while(x != pt0_end) Yap_DebugPlWriteln(*++ x); //CELL *x = pt0; while(x != pt0_end) Yap_DebugPlWriteln(*++ x);
int lvl = push_text_stack(); int lvl = push_text_stack();
Term o = TermNil;
struct cp_frame *to_visit0, struct cp_frame *to_visit0,
*to_visit = Malloc(1024*sizeof(struct cp_frame)); *to_visit = Malloc(1024*sizeof(struct cp_frame));
struct cp_frame *to_visit_max; struct cp_frame *to_visit_max;
@ -188,42 +189,25 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
copy_term_nvar : { copy_term_nvar : {
if (IsPairTerm(d0)) { if (IsPairTerm(d0)) {
CELL *headp = RepPair(d0); CELL *headp = RepPair(d0);
Term head = *headp; if (//(share && headp < HB) ||
if (IsPairTerm(head) && RepPair(head) >= HB && RepPair(head) < HR) { (IsPairTerm(*headp) && RepPair(*headp) >= HB && RepPair(*headp) < HR)) {
if (split) { /* If this is newer than the current term, just reuse */
Term v = Yap_MkNewApplTerm(FunctorEq, 2); *ptf++ = *headp;
RepAppl(v)[1] = AbsPair(ptf);
*headp = *ptf++ = RepAppl(v)[0];
o = MkPairTerm( v, o );
} else {
*ptf++ = RepPair(head)[0];;
}
continue;
} else if (IsApplTerm(head) && RepAppl(head) >= HB && RepAppl(head) < HR) {
*ptf++ = RepAppl(head)[0];
continue; continue;
} }
*ptf++ = AbsPair(HR);
if (to_visit >= to_visit_max-32) { if (to_visit >= to_visit_max-32) {
expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame); expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
} }
*ptf = AbsPair(HR);
ptf++;
to_visit->start_cp = pt0; to_visit->start_cp = pt0;
to_visit->end_cp = pt0_end; to_visit->end_cp = pt0_end;
to_visit->to = ptf; to_visit->to = ptf;
to_visit->curp = headp;
d0 = to_visit->oldv = head;
to_visit->ground = ground; to_visit->ground = ground;
to_visit++; to_visit++;
// move to new list // move to new list
if (share) { d0 = *headp;
TrailedMaBind(headp, AbsPair(HR)); TrailedMaBind(headp, AbsPair(HR));
} else {
/* If this is newer than the current term, just reuse */
*headp = AbsPair(HR);
}
if (split) {
TrailedMaBind(ptf,AbsPair(HR));
}
pt0 = headp; pt0 = headp;
pt0_end = headp + 1; pt0_end = headp + 1;
ptf = HR; ptf = HR;
@ -232,46 +216,20 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
if (HR > ASP - MIN_ARENA_SIZE) { if (HR > ASP - MIN_ARENA_SIZE) {
goto overflow; goto overflow;
} }
d0 = head; ptd0 = pt0;
goto deref; goto deref;
} else if (IsApplTerm(d0)) { } else if (IsApplTerm(d0)) {
Functor f; register Functor f;
CELL *headp, head; register CELL *headp;
/* store the terms to visit */ /* store the terms to visit */
headp = RepAppl(d0); headp = RepAppl(d0);
head = *headp; if (IsApplTerm(*headp)//(share && headp < HB) ||
) {
if (IsPairTerm(head)) { /* If this is newer than the current term, just reuse */
if (split) { *ptf++ = *headp;
Term v = Yap_MkNewApplTerm(FunctorEq, 2);
RepAppl(v)[1] = AbsPair(ptf);
*headp = *ptf++ = RepAppl(v)[0];
o = MkPairTerm( v, o );
} else {
*ptf++ = RepPair(head)[0];;
}
continue;
} else if (IsApplTerm(head)) {
*ptf++ = RepAppl(head)[0];
continue; continue;
} }
f = (Functor)(head); f = (Functor)(*headp);
if (share && (ground || IsExtensionFunctor(f))) {
*ptf++ = d0;
continue;
}
/* store the terms to visit */
*ptf = AbsAppl(HR);
ptf++;
to_visit->start_cp = pt0;
to_visit->end_cp = pt0_end;
to_visit->to = ptf;
to_visit->curp = headp;
to_visit->oldv = head;
to_visit->ground = ground;
if (++to_visit >= to_visit_max-32) {
expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
}
if (IsExtensionFunctor(f)) { if (IsExtensionFunctor(f)) {
switch ((CELL)f) { switch ((CELL)f) {
@ -321,42 +279,44 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
/* big int */ /* big int */
size_t sz = (sizeof(MP_INT) + 3 * CellSize + size_t sz = (sizeof(MP_INT) + 3 * CellSize +
((MP_INT *)(headp + 2))->_mp_alloc * sizeof(mp_limb_t)) / ((MP_INT *)(headp + 2))->_mp_alloc * sizeof(mp_limb_t)) /
CellSize; CellSize,
i;
if (HR > ASP - (MIN_ARENA_SIZE + sz)) { if (HR > ASP - (MIN_ARENA_SIZE + sz)) {
goto overflow; goto overflow;
} }
*ptf++ = AbsAppl(HR); *ptf++ = AbsAppl(HR);
memmove(HR, headp, sz*sizeof(CELL)); HR[0] = (CELL)f;
MP_INT *new = (MP_INT *)(HR + 2); for (i = 1; i < sz; i++) {
new->_mp_d = (mp_limb_t *)(new + 1); HR[i] = headp[i];
}
HR += sz; HR += sz;
} }
} }
continue; continue;
} }
if (share) { *ptf = AbsAppl(HR);
TrailedMaBind(headp,AbsPair(HR)); ptf++;
} else { /* store the terms to visit */
*headp = AbsPair(HR); to_visit->start_cp = pt0;
} to_visit->end_cp = pt0_end;
if (split) { to_visit->to = ptf;
// must be after trailing source term, so that we can check the source to_visit->ground = ground;
// term and confirm it is still ok. if (++to_visit >= to_visit_max-32) {
TrailedMaBind(ptf,AbsAppl(HR)); expand_stack(to_visit0, to_visit, to_visit_max, struct cp_frame);
} }
TrailedMaBind(headp,AbsAppl(HR));
ptf = HR; ptf = HR;
ptf[0] = (CELL)f; *ptf++ = (CELL)f;
ground = true; ground = true;
arity_t a = ArityOfFunctor(f); arity_t a = ArityOfFunctor(f);
HR = ptf+a;
if (HR > ASP - MIN_ARENA_SIZE) { if (HR > ASP - MIN_ARENA_SIZE) {
goto overflow; goto overflow;
} }
ptf++;
HR = ptf+a;
pt0_end = headp+(a);
pt0 = headp; pt0 = headp;
pt0_end = headp+a;
ground = (f != FunctorMutable); ground = (f != FunctorMutable);
} else { } else {
/* just copy atoms or integers */ /* just copy atoms or integers */
@ -369,13 +329,14 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
ground = false; ground = false;
/* don't need to copy variables if we want to share the global term */ /* don't need to copy variables if we want to share the global term */
if (//(share && ptd0 < HB && ptd0 > H0) || if (//(share && ptd0 < HB && ptd0 > H0) ||
(ptd0 >= HB && ptd0 < HR)) { (ptd0 >= HLow && ptd0 < HR)) {
/* we have already found this cell */ /* we have already found this cell */
*ptf++ = (CELL)ptd0; *ptf++ = (CELL)ptd0;
} else } else {
if (copy_att_vars && GlobalIsAttachedTerm((CELL)ptd0)) { if (copy_att_vars && GlobalIsAttachedTerm((CELL)ptd0)) {
/* if unbound, call the standard copy term routine */ /* if unbound, call the standard copy term routine */
struct cp_frame *bp; struct cp_frame *bp;
CELL new;
bp = to_visit; bp = to_visit;
if (!GLOBAL_attas[ExtFromCell(ptd0)].copy_term_op(ptd0, &bp, if (!GLOBAL_attas[ExtFromCell(ptd0)].copy_term_op(ptd0, &bp,
@ -383,29 +344,29 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
goto overflow; goto overflow;
} }
to_visit = bp; to_visit = bp;
new = *ptf;
if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) { if (TR > (tr_fr_ptr)LOCAL_TrailTop - 256) {
/* Trail overflow */ /* Trail overflow */
if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), TRUE)) { if (!Yap_growtrail((TR - TR0) * sizeof(tr_fr_ptr *), TRUE)) {
goto trail_overflow; goto trail_overflow;
} }
} }
TrailedMaBind(ptd0, new);
ptf++;
} else { } else {
/* first time we met this term */ /* first time we met this term */
RESET_VARIABLE(ptf); RESET_VARIABLE(ptf);
*ptd0 = (CELL)ptf; if ((ADDR)TR > LOCAL_TrailTop - MIN_ARENA_SIZE)
ptf++;
TrailTerm(TR++) = (CELL)ptd0;
if ((ADDR)TR > LOCAL_TrailTop - 16)
goto trail_overflow; goto trail_overflow;
TrailedMaBind(ptd0, (CELL)ptf);
ptf++;
}
} }
} }
/* Do we still have compound terms to visit */ /* Do we still have compound terms to visit */
if (to_visit > to_visit0) { if (to_visit > to_visit0) {
to_visit--; to_visit--;
if (!share)
*to_visit->curp = to_visit->oldv;
pt0 = to_visit->start_cp; pt0 = to_visit->start_cp;
pt0_end = to_visit->end_cp; pt0_end = to_visit->end_cp;
ptf = to_visit->to; ptf = to_visit->to;
@ -414,7 +375,7 @@ int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
} }
/* restore our nice, friendly, term to its original state */ /* restore our nice, friendly, term to its original state */
clean_complex_tr(TR0 PASS_REGS); clean_dirty_tr(TR0 PASS_REGS);
/* follow chain of multi-assigned variables */ /* follow chain of multi-assigned variables */
pop_text_stack(lvl); pop_text_stack(lvl);
return 0; return 0;
@ -491,6 +452,7 @@ handle_cp_overflow(int res, tr_fr_ptr TR0, UInt arity, Term t)
} }
} }
static Term static Term
CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) { CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) {
Term t = Deref(inp); Term t = Deref(inp);
@ -505,7 +467,7 @@ CopyTerm(Term inp, UInt arity, int share, int newattvs USES_REGS) {
Hi = HR; Hi = HR;
HR ++; HR ++;
if ((res = Yap_copy_complex_term((&t)-1, &t, share, NULL, newattvs, Hi, HR PASS_REGS)) < 0) { if ((res = Yap_copy_complex_term((&t)-1, &t, share, newattvs, Hi, HR PASS_REGS)) < 0) {
HR = Hi; HR = Hi;
if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L) if ((t = handle_cp_overflow(res, TR0, arity, t))== 0L)
return FALSE; return FALSE;
@ -579,16 +541,6 @@ typedef struct copy_frame {
CELL *to; CELL *to;
} copy_frame_t; } copy_frame_t;
static Term
add_to_list( Term inp, Term v, Term t PASS_REGS)
{
Term ta[2];
ta[0] = v;
ta[1] = t;
return MkPairTerm(Yap_MkApplTerm( FunctorEq, 2, ta ), inp);
}
/* /*
@ -2585,14 +2537,6 @@ p_is_list_or_partial_list( USES_REGS1 )
return Yap_IsListOrPartialListTerm(Deref(ARG1)); return Yap_IsListOrPartialListTerm(Deref(ARG1));
} }
static Term
numbervar(Int id USES_REGS)
{
Term ts[1];
ts[0] = MkIntegerTerm(id);
return Yap_MkApplTerm(FunctorDollarVar, 1, ts);
}
#if 0 #if 0
static Term static Term
numbervar_singleton(USES_REGS1) numbervar_singleton(USES_REGS1)

View File

@ -158,7 +158,8 @@ public:
}; };
}; };
// Java support
/// This class implements a callback Prolog-side. It will be inherited by the /// This class implements a callback Prolog-side. It will be inherited by the
/// Java or Python /// Java or Python
@ -211,46 +212,56 @@ public:
inline bool creatingSavedState() { return install; }; inline bool creatingSavedState() { return install; };
inline void setPLDIR(const char *fl) { inline void setPLDIR(const char *fl) {
LIBDIR = (const char *)malloc(strlen(fl) + 1); std::string *s = new std::string(fl);
strcpy((char *)LIBDIR, fl); LIBDIR = s->c_str();
}; };
inline const char *getPLDIR() { return PLDIR; }; inline const char *getPLDIR() { return PLDIR; };
inline void setINPUT_STARTUP(const char *fl) { inline void setINPUT_STARTUP(const char *fl) {
INPUT_STARTUP = (const char *)malloc(strlen(fl) + 1); std::string *s = new std::string(fl);
strcpy((char *)INPUT_STARTUP, fl); INPUT_STARTUP = s->c_str();
}; };
inline const char *getINPUT_STARTUP() { return INPUT_STARTUP; }; inline const char *getINPUT_STARTUP() { return INPUT_STARTUP; };
inline void setOUTPUT_STARTUP(const char *fl) {
std::string *s = new std::string(fl);
OUTPUT_STARTUP = s->c_str();
};
inline void setOUTPUT_RESTORE(const char *fl) { inline void setOUTPUT_RESTORE(const char *fl) {
OUTPUT_STARTUP = (const char *)malloc(strlen(fl) + 1); std::string *s = new std::string(fl);
strcpy((char *)OUTPUT_STARTUP, fl); OUTPUT_STARTUP = s->c_str();
}; };
inline const char *getOUTPUT_STARTUP() { return OUTPUT_STARTUP; }; inline const char *getOUTPUT_STARTUP() { return OUTPUT_STARTUP; };
inline void setSOURCEBOOT(const char *fl) { inline void setSOURCEBOOT(const char *fl) {
SOURCEBOOT = (const char *)malloc(strlen(fl) + 1); std::string *s = new std::string(fl);
strcpy((char *)SOURCEBOOT, fl); SOURCEBOOT = s->c_str();
}; };
inline const char *getSOURCEBOOT() { return SOURCEBOOT; }; inline const char *getSOURCEBOOT() { return SOURCEBOOT; };
inline void setPrologBOOTSTRAP(const char *fl) { inline void setPrologBOOTSTRAP(const char *fl) {
BOOTSTRAP = (const char *)malloc(strlen(fl) + 1); std::string *s = new std::string(fl);
strcpy((char *)BOOTSTRAP, fl); BOOTSTRAP = s->c_str();
}; };
inline const char *getBOOTSTRAP() { return BOOTSTRAP; }; inline const char *getBOOTSTRAP() { return BOOTSTRAP; };
inline void setPrologGoal(const char *fl) { PrologGoal = fl; }; inline void setPrologGoal(const char *fl) {
std::string *s = new std::string(fl);
PrologGoal = s->c_str();
}
inline const char *getPrologGoal() { return PrologGoal; }; inline const char *getPrologGoal() { return PrologGoal; };
inline void setPrologTopLevelGoal(const char *fl) { inline void setPrologTopLevelGoal(const char *fl) {
PrologTopLevelGoal = fl; std::string *s = new std::string(fl);
PrologTopLevelGoal = s->c_str() ;
}; };
inline const char *getPrologTopLevelGoal() { return PrologTopLevelGoal; }; inline const char *getPrologTopLevelGoal() { return PrologTopLevelGoal; };
@ -271,7 +282,27 @@ public:
inline char **getArgv() { return Argv; }; inline char **getArgv() { return Argv; };
inline void setROOTDIR(char *fl) { ROOTDIR = fl; }; inline void setBOOTDIR(const char *fl) {
std::string *s = new std::string(fl);
BOOTDIR = s->c_str() ;
}
inline const char *getBOOTDIR() { return BOOTDIR; };
inline const char *getBOOTFILE() { return BOOTSTRAP; };
inline void setBOOTFILE(const char *fl) {
std::string *s = new std::string(fl);
BOOTSTRAP = s->c_str() ;
}
inline void setROOTDIR(const char *fl) {
std::string *s = new std::string(fl);
ROOTDIR = s->c_str() ;
}
}; };
/** /**

View File

@ -484,7 +484,7 @@ extern void Yap_InitUserBacks(void);
/* utilpreds.c */ /* utilpreds.c */
int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end, int Yap_copy_complex_term(register CELL *pt0, register CELL *pt0_end,
bool share, Term *split, bool copy_att_vars, CELL *ptf, bool share, bool copy_att_vars, CELL *ptf,
CELL *HLow USES_REGS); CELL *HLow USES_REGS);
extern Term Yap_CopyTerm(Term); extern Term Yap_CopyTerm(Term);
extern bool Yap_Variant(Term, Term); extern bool Yap_Variant(Term, Term);

3
configure vendored
View File

@ -358,6 +358,7 @@ while [ $# != 0 ]; do
esac; esac;
shift shift
done done
_LIBDIR=${LIBDIR} ${CMAKE_ARGS}
if [ "x${LIBDIR}" = "x" ]; then if [ "x${LIBDIR}" = "x" ]; then
LIBDIR="${PREFIX}/lib" LIBDIR="${PREFIX}/lib"
@ -373,4 +374,4 @@ fi
CMAKE_CMD="${CMAKE} ${TOP_SRCDIR}" CMAKE_CMD="${CMAKE} ${TOP_SRCDIR}"
${CMAKE_CMD} "${GENERATOR}" ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DCMAKE_INSTALL_LIBDIR=${LIBDIR} ${CMAKE_ARGS} ${CMAKE_CMD} "${GENERATOR}" ${TOP_SRCDIR} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX=${PREFIX} ${CMAKE_ARGS}

View File

@ -29,7 +29,7 @@
%% %%
%% @brief Input/Output to characters. %% @brief Input/Output to characters.
:- module(system(charsio), [ :- module(charsio, [
format_to_chars/3, format_to_chars/3,
format_to_chars/4, format_to_chars/4,
write_to_chars/3, write_to_chars/3,

View File

@ -1,3 +1,4 @@
/************************************************************************* /*************************************************************************
* * * *
* YAP Prolog * * YAP Prolog *
@ -381,10 +382,12 @@ static Term syntax_error(TokEntry *errtok, int sno, Term cmod, Int newpos, bool
Int end_line = GetCurInpLine(GLOBAL_Stream + sno); Int end_line = GetCurInpLine(GLOBAL_Stream + sno);
Int endpos = GetCurInpPos(GLOBAL_Stream + sno); Int endpos = GetCurInpPos(GLOBAL_Stream + sno);
Yap_local.ActiveError->errorNo = SYNTAX_ERROR; Yap_local.ActiveError->prologConsulting = Yap_Consulting();
Yap_local.ActiveError->parserFirstLine = start_line; Yap_local.ActiveError->parserFirstLine = start_line;
Yap_local.ActiveError->parserLine = err_line;
Yap_local.ActiveError->parserLastLine = end_line; Yap_local.ActiveError->parserLastLine = end_line;
Yap_local.ActiveError->parserFirstPos = startpos; Yap_local.ActiveError->parserFirstPos = startpos;
Yap_local.ActiveError->parserPos = errpos;
Yap_local.ActiveError->parserLastPos = endpos; Yap_local.ActiveError->parserLastPos = endpos;
Yap_local.ActiveError->parserFile = Yap_local.ActiveError->parserFile =
RepAtom(AtomOfTerm((GLOBAL_Stream + sno)->user_name))->StrOfAE; RepAtom(AtomOfTerm((GLOBAL_Stream + sno)->user_name))->StrOfAE;
@ -1155,8 +1158,7 @@ static Term syntax_error(TokEntry *errtok, int sno, Term cmod, Int newpos, bool
re->cpos = GLOBAL_Stream[inp_stream].charcount; re->cpos = GLOBAL_Stream[inp_stream].charcount;
} }
LOCAL_Error_TYPE = WARNING_SYNTAX_ERROR; LOCAL_Error_TYPE = WARNING_SYNTAX_ERROR;
t = Yap_MkFullError(); Yap_PrintWarning(0);
Yap_PrintWarning(t);
LOCAL_Error_TYPE = YAP_NO_ERROR; LOCAL_Error_TYPE = YAP_NO_ERROR;
if (ParserErrorStyle == TermDec10) if (ParserErrorStyle == TermDec10)
{ {

View File

@ -761,31 +761,33 @@ bool python_release_GIL(term_t curBlock) {
} }
install_t install_pypreds(void) { install_t install_pypreds(void) {
PL_register_foreign("python_builtin_eval", 3, python_builtin_eval, 0);
PL_register_foreign("python_builtin", 1, python_builtin, 0); PL_register_foreign_in_module("python", "python_builtin_eval", 3, python_builtin_eval, 0);
PL_register_foreign("python_import", 2, python_import, 0); PL_register_foreign_in_module("python", "python_builtin", 1, python_builtin, 0);
PL_register_foreign("python_to_rhs", 2, python_to_rhs, 0); PL_register_foreign_in_module("python", "python_import", 2, python_import, 0);
PL_register_foreign("python_len", 2, python_len, 0); PL_register_foreign_in_module("python", "python_to_rhs", 2, python_to_rhs, 0);
PL_register_foreign("python_is", 2, python_is, 0); PL_register_foreign_in_module("python", "python_len", 2, python_len, 0);
PL_register_foreign("python_dir", 2, python_dir, 0); PL_register_foreign_in_module("python", "python_is", 2, python_is, 0);
PL_register_foreign("python_apply", 4, python_apply, 0); PL_register_foreign_in_module("python", "python_dir", 2, python_dir, 0);
PL_register_foreign("python_index", 3, python_index, 0); PL_register_foreign_in_module("python", "python_apply", 4, python_apply, 0);
PL_register_foreign("python_field", 3, python_field, 0); PL_register_foreign_in_module("python", "python_index", 3, python_index, 0);
PL_register_foreign("python_assign", 2, assign_python, 0); PL_register_foreign_in_module("python", "python_field", 3, python_field, 0);
PL_register_foreign("python_represents", 2, python_represent, 0); PL_register_foreign_in_module("python", "python_assign", 2, assign_python, 0);
PL_register_foreign("python_export", 2, python_export, 0); PL_register_foreign_in_module("python", "python_represents", 2, python_represent, 0);
PL_register_foreign("python_function", 1, python_function, 0); PL_register_foreign_in_module("python", "python_export", 2, python_export, 0);
PL_register_foreign("python_slice", 4, python_slice, 0); PL_register_foreign_in_module("python", "python_function", 1, python_function, 0);
PL_register_foreign("python_run_file", 1, python_run_file, 0); PL_register_foreign_in_module("python", "python_slice", 4, python_slice, 0);
PL_register_foreign("python_proc", 1, python_proc, 0); PL_register_foreign_in_module("python", "python_run_file", 1, python_run_file, 0);
PL_register_foreign("python_run_command", 1, python_run_command, 0); PL_register_foreign_in_module("python", "python_proc", 1, python_proc, 0);
PL_register_foreign("python_run_script", 2, python_run_script, 0); PL_register_foreign_in_module("python", "python_run_command", 1, python_run_command, 0);
PL_register_foreign("python_main_module", 1, python_main_module, 0); PL_register_foreign_in_module("python", "python_run_script", 2, python_run_script, 0);
PL_register_foreign("python_import", 2, python_import, 0); PL_register_foreign_in_module("python", "python_main_module", 1, python_main_module, 0);
PL_register_foreign("python_access", 3, python_access, 0); PL_register_foreign_in_module("python", "python_import", 2, python_import, 0);
PL_register_foreign("python_threaded", 0, p_python_threaded, 0); PL_register_foreign_in_module("python", "python_access", 3, python_access, 0);
PL_register_foreign("python_clear_errors", 0, python_clear_errors, 0); PL_register_foreign_in_module("python", "python_threaded", 0, p_python_threaded, 0);
PL_register_foreign("python_string_to", 1, python_string_to, 0); PL_register_foreign_in_module("python", "python_clear_errors", 0, python_clear_errors, 0);
PL_register_foreign_in_module("python", "python_string_to", 1, python_string_to, 0);
init_python_vfs(); init_python_vfs();
} }

View File

@ -43,13 +43,18 @@
op(50, yf, []), op(50, yf, []),
op(50, yf, '()'), op(50, yf, '()'),
op(100, xfy, '.'), op(100, xfy, '.'),
op(100, fy, '.') op(100, fy, '.'),
(:=)/2,
(:=)/1,
% (<-)/1,
% (<-)/2,
'()'/1, '{}'/1, dot_qualified_goal/1, import_arg/1
]). ]).
/** @defgroup Py4YAP A C-based Prolog interface to python. /** @defgroup Py4YAP A C-based Prolog interface to python.
@ingroup python @ingroup python
b
@{ @{
@author Vitor Santos Costa @author Vitor Santos Costa
@ -96,7 +101,7 @@ similar as possible.
Python interface Python interface
Data types are Data types arebb
Python Prolog Python Prolog
string atoms string atoms
@ -115,34 +120,38 @@ Data types are
:- use_module(library(charsio)). :- use_module(library(charsio)).
:- dynamic python_mref_cache/2, python_obj_cache/2. :- dynamic python_mref_cache/2, python_obj_cache/2.
:- multifile user:(:=)/2, :- op(100,fy,'$'),
user:(:=)/1, op(950,fy,:=),
% user:(<-)/1, op(950,yfx,:=),
% user:(<-)/2, % op(950,fx,<-),
user:'()'/1, user:'{}'/1, user:dot_qualified_goal/1, user:import_arg/1. % op(950,yfx,<-),
op(50, yf, []),
op(50, yf, '()'),
op(100, xfy, '.'),
op(100, fy, '.').
:- multifile (<-)/1, (<-)/2,
'()'/1, '{}'/1,
dot_qualified_goal/1,
import_arg/1.
import( F ) :- catch( python:python_import(F), _, fail ). import( F ) :- catch( python:python_import(F), _, fail ).
user:dot_qualified_goal(Fs) :- catch( python:python_proc(Fs), _, fail ). dot_qualified_goal(Fs) :- catch( python:python_proc(Fs), _, fail ).
user:F() :- '()'(F) :-
catch( python:python_proc(F() ), _, fail ). catch( python_proc(()(F) ), _, fail ).
user(P1,P2) :- !,
:= P1,
:= P2.
:= F :- catch( python:python_proc(F), _, fail ).
:= (P1,P2) :- !, := (P1,P2) :- !,
:= P1, := P1,
:= P2. := P2.
user:(:= F) :- catch( python:python_proc(F), _, fail ). := F :- catch( python:python_proc(F), _, fail ).
user:( V := F ) :-
V := F :-
python:python_assign(F, V). python:python_assign(F, V).
/* /*
@ -153,15 +162,15 @@ user:(V <- F) :-
V := F. V := F.
*/ */
python:python_import(Module) :- python_import(Module) :-
python:python_import(Module, _). python_import(Module, _).
python(Exp, Out) :- python(Exp, Out) :-
Out := Exp. Out := Exp.
python_command(Cmd) :- python_command(Cmd) :-
python:python_run_command(Cmd). python_run_command(Cmd).
start_python :- start_python :-
python:python_import('inspect', _), python:python_import('inspect', _),

View File

@ -2,21 +2,21 @@
%% @file yapi.yap %% @file yapi.yap
%% @brief support yap shell %% @brief support yap shell
%% %%
%:- start_low_level_trace.
%% :- module(yapi, [
%% python_ouput/0,
%% show_answer/2,
%% show_answer/3,
%% yap_query/4,
%% python_query/2,
%% python_query/3,
%% python_import/1,
%% yapi_query/2
%% ]).
:- yap_flag(verbose, silent). :- module(yapi, [
python_ouput/0,
show_answer/2,
show_answer/3,
yap_query/4,
python_query/2,
python_query/3,
python_import/1,
yapi_query/2
]).
:- use_module(library(python)). %:- yap_flag(verbose, silent).
:- reexport(library(python)).
:- use_module( library(lists) ). :- use_module( library(lists) ).
:- use_module( library(maplist) ). :- use_module( library(maplist) ).
@ -46,9 +46,6 @@ yapi_query( VarNames, Self ) :-
set_preds :- set_preds :-
fail, fail,
current_predicate(P, Q),
functor(Q,P,A),
current_predicate(P, Q), current_predicate(P, Q),
functor(Q,P,A), functor(Q,P,A),
atom_string(P,S), atom_string(P,S),
@ -69,27 +66,31 @@ fail,
set_preds. set_preds.
argi(N,I,I1) :- argi(N,I,I1) :-
atomic_concat(`A`,I,N), atomic_concat('A',I,N),
I1 is I+1. I1 is I+1.
python_query( Caller, String ) :- python_query( Caller, String ) :-
python_query( Caller, String, _Bindings).
python_query( Caller, String, Bindings ) :-
atomic_to_term( String, Goal, VarNames ), atomic_to_term( String, Goal, VarNames ),
query_to_answer( Goal, _, Status, VarNames, Bindings), query_to_answer( Goal, VarNames, Status, Bindings),
Caller.port := Status, Caller.port := Status,
output(Caller, Bindings). output(Caller, Bindings).
output( _, Bindings ) :-
write_query_answer( Bindings ),
fail.
output( Caller, Bindings ) :- output( Caller, Bindings ) :-
answer := {}, Answer := {},
% start_low_level_trace,
foldl(ground_dict(answer), Bindings, [], Ts), foldl(ground_dict(answer), Bindings, [], Ts),
term_variables( Ts, Hidden), term_variables( Ts, Hidden),
foldl(bv, Hidden , 0, _), foldl(bv, Hidden , 0, _),
maplist(into_dict(answer),Ts), maplist(into_dict(Answer),Ts),
Caller.answer := json.dumps(answer), Caller.answer := Answer,
S := Caller.answer, fail.
format(user_error, '~nor ~s~n~n',S),
output( _, Bindings ) :-
write_query_answer( Bindings ),
fail. fail.
output(_Caller, _Bindings). output(_Caller, _Bindings).
@ -98,7 +99,22 @@ bv(V,I,I1) :-
I1 is I+1. I1 is I+1.
into_dict(D,V0=T) :- into_dict(D,V0=T) :-
python_represents(D[V0], T). atom(T),
!,
D[V0] := T.
into_dict(D,V0=T) :-
integer(T),
writeln((D[V0]:=T)),
!,
D[V0] := T,
:= print(D).
into_dict(D,V0=T) :-
string(T),
!,
D[V0] := T.
into_dict(D,V0=T) :-
python_represents(T1,T),
D[V0] := T1.
/** /**
* *

View File

@ -69,7 +69,7 @@ elif platform.system() == 'Darwin':
win_libs = [] win_libs = []
local_libs = ['Py4YAP'] local_libs = ['Py4YAP']
elif platform.system() == 'Linux': elif platform.system() == 'Linux':
my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-Wl,-rpath,@CMAKE_INSTALL_FULL_LIBDIR@','-Wl,-rpath,'+join('@CMAKE_INSTALL_FULL_LIBDIR@','..'),'-Wl,-rpath,../yap4py'] my_extra_link_args = ['-L','..','-Wl,-rpath,'+abspath(join(sysconfig.get_path('platlib'),'yap4py')),'-L','@CMAKE_INSTALL_FULL_LIBDIR@','-Wl,-rpath,@CMAKE_INSTALL_FULL_LIBDIR@','-Wl,-rpath,'+join('@CMAKE_INSTALL_FULL_LIBDIR@','..'),'-Wl,-rpath,../yap4py']
win_libs = [] win_libs = []
local_libs = ['Py4YAP'] local_libs = ['Py4YAP']

View File

@ -5,44 +5,75 @@
* @brief JUpyter support. * @brief JUpyter support.
*/ */
:- yap_flag(gc_trace,verbose). %:- yap_flag(gc_trace,verbose).
/*
:- module( jupyter, :- module( jupyter,
[jupyter_queryl/3, [jupyter_query/3,
jupyter_query/4,
op(100,fy,('$')),
op(950,fy,:=),
op(950,yfx,:=),
% op(950,fx,<-),
% op(950,yfx,<-),
op(50, yf, []),
op(50, yf, '()'),
op(100, xfy, '.'),
op(100, fy, '.'),
blank/1, blank/1,
streams/2 streams/1
] ]
). ).
*/
:- use_module(library(hacks)). :- use_module(library(hacks)).
:- use_module(library(lists)). :- use_module(library(lists)).
:- use_module(library(maplist)). :- use_module(library(maplist)).
%% :- reexport(library(python)).
%% :- reexport(library(yapi)). :- use_module(library(python)).
%% :- reexport(library(complete)). :- use_module(library(yapi)).
%% :- reexport(library(verify)). :- use_module(library(complete)).
:- use_module(library(verify)).
:- python_import(sys). :- python_import(sys).
jupyter_query(Caller, Cell, Line, Bindings ) :-
gated_call(
streams(true),
jupyter_cell(Caller, Cell, Line, Bindings),
Port,
next_streams( Caller, Port, Bindings )
).
jupyter_query(Caller, Cell, Line ) :- jupyter_query(Caller, Cell, Line ) :-
jupyter_cell(Caller, Cell, Line). jupyter_query( Caller, Cell, Line, _Bindings ).
jupyter_cell(_Caller, Cell, _Line) :- next_streams( _Caller, exit, _Bindings ) :-
% Caller.answer := Bindings,
!.
next_streams( _Caller, answer, _Bindings ) :-
% Caller.answer := Bindings,
!.
next_streams(_, redo, _ ) :-
streams(true),
!.
next_streams( _, _, _ ) :-
streams(false).
jupyter_cell(_Caller, Cell, _Line, _) :-
jupyter_consult(Cell), %stack_dump, jupyter_consult(Cell), %stack_dump,
fail. fail.
jupyter_cell( _Caller, _, ¨¨ ) :- !. jupyter_cell( _Caller, _, ¨¨ , _) :- !.
jupyter_cell( _Caller, _, Line ) :- jupyter_cell( _Caller, _, Line , _) :-
blank( Line ), blank( Line ),
!. !.
jupyter_cell(Caller, _, Line ) :- jupyter_cell(Caller, _, Line, Bindings ) :-
Query = Caller, Query = Caller,
catch( catch(
python_query(Query,Line), python_query(Query,Line, Bindings),
error(A,B), error(A,B),
system_error(A,B) system_error(A,B)
). ).
@ -58,6 +89,8 @@ restreams(!).
restreams(external_exception(_)). restreams(external_exception(_)).
restreams(exception). restreams(exception).
%:- meta_predicate
jupyter_consult(Text) :- jupyter_consult(Text) :-
blank( Text ), blank( Text ),
!. !.

View File

@ -16,7 +16,7 @@
:- use_module(library(lists)). :- use_module(library(lists)).
:- use_module(library(maplist)). :- use_module(library(maplist)).
:- use_module(library(python)). %% :- use_module(library(python)).
%% :- use_module(library(yapi)). %% :- use_module(library(yapi)).
:- dynamic jupyter/1. :- dynamic jupyter/1.
@ -25,7 +25,7 @@ jupyter( []).
ready( Engine, Query) :- ready( Engine, Query) :-
errors( Engine , Query ), errors( Engine , Query ),
Es := Engine.errors, Es := Engine.errors,
not Es == []. Es \== [].

View File

@ -1,19 +1,19 @@
""" """
Shim to maintain backwards compatibility with old yap_ipython.terminal.console imports. Shim to maintain backwards compatibility with old IPython.terminal.console imports.
""" """
# Copyright (c) yap_ipython Development Team. # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
import sys import sys
from warnings import warn from warnings import warn
from yap_ipython.utils.shimmodule import ShimModule, ShimWarning from IPython.utils.shimmodule import ShimModule, ShimWarning
warn("The `yap_ipython.terminal.console` package has been deprecated since yap_ipython 4.0. " warn("The `IPython.terminal.console` package has been deprecated since IPython 4.0. "
"You should import from jupyter_console instead.", ShimWarning) "You should import from jupyter_console instead.", ShimWarning)
# Unconditionally insert the shim into sys.modules so that further import calls # Unconditionally insert the shim into sys.modules so that further import calls
# trigger the custom attribute access above # trigger the custom attribute access above
sys.modules['yap_ipython.terminal.console'] = ShimModule( sys.modules['IPython.terminal.console'] = ShimModule(
src='yap_ipython.terminal.console', mirror='jupyter_console') src='IPython.terminal.console', mirror='jupyter_console')

View File

@ -1,18 +1,18 @@
import signal import signal
import sys import sys
from yap_ipython.core.debugger import Pdb from IPython.core.debugger import Pdb
from yap_ipython.core.completer import IPCompleter from IPython.core.completer import IPCompleter
from .ptutils import IPythonPTCompleter from .ptutils import IPythonPTCompleter
from .shortcuts import suspend_to_bg, cursor_in_leading_ws from .shortcuts import suspend_to_bg, cursor_in_leading_ws
from prompt_toolkit.enums import DEFAULT_BUFFER from prompt_toolkit.enums import DEFAULT_BUFFER
from prompt_toolkit.filters import (Condition, HasFocus, HasSelection, from prompt_toolkit.filters import (Condition, has_focus, has_selection,
ViInsertMode, EmacsInsertMode) vi_insert_mode, emacs_insert_mode)
from prompt_toolkit.keys import Keys from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.key_binding.manager import KeyBindingManager
from prompt_toolkit.key_binding.bindings.completion import display_completions_like_readline from prompt_toolkit.key_binding.bindings.completion import display_completions_like_readline
from pygments.token import Token
from prompt_toolkit.shortcuts.prompt import PromptSession from prompt_toolkit.shortcuts.prompt import PromptSession
from prompt_toolkit.enums import EditingMode from prompt_toolkit.enums import EditingMode
from prompt_toolkit.formatted_text import PygmentsTokens from prompt_toolkit.formatted_text import PygmentsTokens
@ -58,6 +58,7 @@ class TerminalPdb(Pdb):
complete_style=self.shell.pt_complete_style, complete_style=self.shell.pt_complete_style,
style=self.shell.style, style=self.shell.style,
inputhook=self.shell.inputhook, inputhook=self.shell.inputhook,
color_depth=self.shell.color_depth,
) )
def cmdloop(self, intro=None): def cmdloop(self, intro=None):
@ -107,7 +108,7 @@ def set_trace(frame=None):
if __name__ == '__main__': if __name__ == '__main__':
import pdb import pdb
# yap_ipython.core.debugger.Pdb.trace_dispatch shall not catch # IPython.core.debugger.Pdb.trace_dispatch shall not catch
# bdb.BdbQuit. When started through __main__ and an exception # bdb.BdbQuit. When started through __main__ and an exception
# happened after hitting "c", this is needed in order to # happened after hitting "c", this is needed in order to
# be able to quit the debugging session (see #9950). # be able to quit the debugging session (see #9950).

View File

@ -1,27 +1,27 @@
# encoding: utf-8 # encoding: utf-8
""" """
An embedded yap_ipython shell. An embedded IPython shell.
""" """
# Copyright (c) yap_ipython Development Team. # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
import sys import sys
import warnings import warnings
from yap_ipython.core import ultratb, compilerop from IPython.core import ultratb, compilerop
from yap_ipython.core import magic_arguments from IPython.core import magic_arguments
from yap_ipython.core.magic import Magics, magics_class, line_magic from IPython.core.magic import Magics, magics_class, line_magic
from yap_ipython.core.interactiveshell import DummyMod, InteractiveShell from IPython.core.interactiveshell import DummyMod, InteractiveShell
from yap_ipython.terminal.interactiveshell import TerminalInteractiveShell from IPython.terminal.interactiveshell import TerminalInteractiveShell
from yap_ipython.terminal.ipapp import load_default_config from IPython.terminal.ipapp import load_default_config
from traitlets import Bool, CBool, Unicode from traitlets import Bool, CBool, Unicode
from yap_ipython.utils.io import ask_yes_no from IPython.utils.io import ask_yes_no
class KillEmbedded(Exception):pass class KillEmbedded(Exception):pass
# kept for backward compatibility as yap_ipython 6 was released with # kept for backward compatibility as IPython 6 was released with
# the typo. See https://github.com/ipython/ipython/pull/10706 # the typo. See https://github.com/ipython/ipython/pull/10706
KillEmbeded = KillEmbedded KillEmbeded = KillEmbedded
@ -38,10 +38,10 @@ class EmbeddedMagics(Magics):
@magic_arguments.argument('-y', '--yes', action='store_true', @magic_arguments.argument('-y', '--yes', action='store_true',
help='Do not ask confirmation') help='Do not ask confirmation')
def kill_embedded(self, parameter_s=''): def kill_embedded(self, parameter_s=''):
"""%kill_embedded : deactivate for good the current embedded yap_ipython """%kill_embedded : deactivate for good the current embedded IPython
This function (after asking for confirmation) sets an internal flag so This function (after asking for confirmation) sets an internal flag so
that an embedded yap_ipython will never activate again for the given call that an embedded IPython will never activate again for the given call
location. This is useful to permanently disable a shell that is being location. This is useful to permanently disable a shell that is being
called inside a loop: once you've figured out what you needed from it, called inside a loop: once you've figured out what you needed from it,
you may then kill it and the program will then continue to run without you may then kill it and the program will then continue to run without
@ -59,7 +59,7 @@ class EmbeddedMagics(Magics):
.. note:: .. note::
This was the default behavior before yap_ipython 5.2 This was the default behavior before IPython 5.2
""" """
@ -74,7 +74,7 @@ class EmbeddedMagics(Magics):
kill = True kill = True
if kill: if kill:
self.shell._disable_init_location() self.shell._disable_init_location()
print("This embedded yap_ipython instance will not reactivate anymore " print("This embedded IPython instance will not reactivate anymore "
"once you exit.") "once you exit.")
else: else:
if not args.yes: if not args.yes:
@ -84,7 +84,7 @@ class EmbeddedMagics(Magics):
kill = True kill = True
if kill: if kill:
self.shell.embedded_active = False self.shell.embedded_active = False
print("This embedded yap_ipython call location will not reactivate anymore " print("This embedded IPython call location will not reactivate anymore "
"once you exit.") "once you exit.")
if args.exit: if args.exit:
@ -97,9 +97,9 @@ class EmbeddedMagics(Magics):
def exit_raise(self, parameter_s=''): def exit_raise(self, parameter_s=''):
"""%exit_raise Make the current embedded kernel exit and raise and exception. """%exit_raise Make the current embedded kernel exit and raise and exception.
This function sets an internal flag so that an embedded yap_ipython will This function sets an internal flag so that an embedded IPython will
raise a `yap_ipython.terminal.embed.KillEmbedded` Exception on exit, and then exit the current I. This is raise a `IPython.terminal.embed.KillEmbedded` Exception on exit, and then exit the current I. This is
useful to permanently exit a loop that create yap_ipython embed instance. useful to permanently exit a loop that create IPython embed instance.
""" """
self.shell.should_raise = True self.shell.should_raise = True
@ -148,7 +148,7 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
def __init__(self, **kw): def __init__(self, **kw):
if kw.get('user_global_ns', None) is not None: if kw.get('user_global_ns', None) is not None:
raise DeprecationWarning( raise DeprecationWarning(
"Key word argument `user_global_ns` has been replaced by `user_module` since yap_ipython 4.0.") "Key word argument `user_global_ns` has been replaced by `user_module` since IPython 4.0.")
clid = kw.pop('_init_location_id', None) clid = kw.pop('_init_location_id', None)
if not clid: if not clid:
@ -166,7 +166,7 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
def init_sys_modules(self): def init_sys_modules(self):
""" """
Explicitly overwrite :mod:`yap_ipython.core.interactiveshell` to do nothing. Explicitly overwrite :mod:`IPython.core.interactiveshell` to do nothing.
""" """
pass pass
@ -234,12 +234,12 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
print(self.exit_msg) print(self.exit_msg)
if self.should_raise: if self.should_raise:
raise KillEmbedded('Embedded yap_ipython raising error, as user requested.') raise KillEmbedded('Embedded IPython raising error, as user requested.')
def mainloop(self, local_ns=None, module=None, stack_depth=0, def mainloop(self, local_ns=None, module=None, stack_depth=0,
display_banner=None, global_ns=None, compile_flags=None): display_banner=None, global_ns=None, compile_flags=None):
"""Embeds yap_ipython into a running python program. """Embeds IPython into a running python program.
Parameters Parameters
---------- ----------
@ -265,10 +265,10 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
""" """
if (global_ns is not None) and (module is None): if (global_ns is not None) and (module is None):
raise DeprecationWarning("'global_ns' keyword argument is deprecated, and has been removed in yap_ipython 5.0 use `module` keyword argument instead.") raise DeprecationWarning("'global_ns' keyword argument is deprecated, and has been removed in IPython 5.0 use `module` keyword argument instead.")
if (display_banner is not None): if (display_banner is not None):
warnings.warn("The display_banner parameter is deprecated since yap_ipython 4.0", DeprecationWarning) warnings.warn("The display_banner parameter is deprecated since IPython 4.0", DeprecationWarning)
# Get locals and globals from caller # Get locals and globals from caller
if ((local_ns is None or module is None or compile_flags is None) if ((local_ns is None or module is None or compile_flags is None)
@ -323,7 +323,7 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
with self.builtin_trap, self.display_trap: with self.builtin_trap, self.display_trap:
self.interact() self.interact()
# now, purge out the local namespace of yap_ipython's hidden variables. # now, purge out the local namespace of IPython's hidden variables.
if local_ns is not None: if local_ns is not None:
local_ns.update({k: v for (k, v) in self.user_ns.items() if k not in self.user_ns_hidden.keys()}) local_ns.update({k: v for (k, v) in self.user_ns.items() if k not in self.user_ns_hidden.keys()})
@ -335,7 +335,7 @@ class InteractiveShellEmbed(TerminalInteractiveShell):
def embed(**kwargs): def embed(**kwargs):
"""Call this to embed yap_ipython at the current point in your program. """Call this to embed IPython at the current point in your program.
The first invocation of this will create an :class:`InteractiveShellEmbed` The first invocation of this will create an :class:`InteractiveShellEmbed`
instance and then call it. Consecutive calls just call the already instance and then call it. Consecutive calls just call the already
@ -343,12 +343,12 @@ def embed(**kwargs):
If you don't want the kernel to initialize the namespace If you don't want the kernel to initialize the namespace
from the scope of the surrounding function, from the scope of the surrounding function,
and/or you want to load full yap_ipython configuration, and/or you want to load full IPython configuration,
you probably want `yap_ipython.start_ipython()` instead. you probably want `IPython.start_ipython()` instead.
Here is a simple example:: Here is a simple example::
from yap_ipython import embed from IPython import embed
a = 10 a = 10
b = 20 b = 20
embed(header='First time') embed(header='First time')

View File

@ -1,15 +1,15 @@
"""yap_ipython terminal interface using prompt_toolkit""" """IPython terminal interface using prompt_toolkit"""
import os import os
import sys import sys
import warnings import warnings
from warnings import warn from warnings import warn
from yap_ipython.core.interactiveshell import InteractiveShell, InteractiveShellABC from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
from yap_ipython.utils import io from IPython.utils import io
from yap_ipython.utils.py3compat import input from IPython.utils.py3compat import input
from yap_ipython.utils.terminal import toggle_set_term_title, set_term_title from IPython.utils.terminal import toggle_set_term_title, set_term_title
from yap_ipython.utils.process import abbrev_cwd from IPython.utils.process import abbrev_cwd
from traitlets import ( from traitlets import (
Bool, Unicode, Dict, Integer, observe, Instance, Type, default, Enum, Union, Bool, Unicode, Dict, Integer, observe, Instance, Type, default, Enum, Union,
Any, validate Any, validate
@ -98,8 +98,8 @@ class TerminalInteractiveShell(InteractiveShell):
simple_prompt = Bool(_use_simple_prompt, simple_prompt = Bool(_use_simple_prompt,
help="""Use `raw_input` for the REPL, without completion and prompt colors. help="""Use `raw_input` for the REPL, without completion and prompt colors.
Useful when controlling yap_ipython as a subprocess, and piping STDIN/OUT/ERR. Known usage are: Useful when controlling IPython as a subprocess, and piping STDIN/OUT/ERR. Known usage are:
yap_ipython own testing machinery, and emacs inferior-shell integration through elpy. IPython own testing machinery, and emacs inferior-shell integration through elpy.
This mode default to `True` if the `IPY_TEST_SIMPLE_PROMPT` This mode default to `True` if the `IPY_TEST_SIMPLE_PROMPT`
environment variable is set, or the current terminal is not a tty.""" environment variable is set, or the current terminal is not a tty."""
@ -111,7 +111,7 @@ class TerminalInteractiveShell(InteractiveShell):
confirm_exit = Bool(True, confirm_exit = Bool(True,
help=""" help="""
Set to confirm when you try to exit yap_ipython with an EOF (Control-D Set to confirm when you try to exit IPython with an EOF (Control-D
in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit', in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
you can force a direct exit without any confirmation.""", you can force a direct exit without any confirmation.""",
).tag(config=True) ).tag(config=True)
@ -147,6 +147,7 @@ class TerminalInteractiveShell(InteractiveShell):
@observe('editing_mode') @observe('editing_mode')
def _editing_mode(self, change): def _editing_mode(self, change):
u_mode = change.new.upper() u_mode = change.new.upper()
if self.pt_app:
self.pt_app.editing_mode = u_mode self.pt_app.editing_mode = u_mode
@observe('highlighting_style') @observe('highlighting_style')
@ -170,7 +171,7 @@ class TerminalInteractiveShell(InteractiveShell):
).tag(config=True) ).tag(config=True)
editor = Unicode(get_default_editor(), editor = Unicode(get_default_editor(),
help="Set the editor used by yap_ipython (default to $EDITOR/vi/notepad)." help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
).tag(config=True) ).tag(config=True)
prompts_class = Type(Prompts, help='Class used to generate Prompt token for prompt_toolkit').tag(config=True) prompts_class = Type(Prompts, help='Class used to generate Prompt token for prompt_toolkit').tag(config=True)
@ -193,7 +194,7 @@ class TerminalInteractiveShell(InteractiveShell):
help="Automatically set the terminal title" help="Automatically set the terminal title"
).tag(config=True) ).tag(config=True)
term_title_format = Unicode("yap_ipython: {cwd}", term_title_format = Unicode("IPython: {cwd}",
help="Customize the terminal title format. This is a python format string. " + help="Customize the terminal title format. This is a python format string. " +
"Available substitutions are: {cwd}." "Available substitutions are: {cwd}."
).tag(config=True) ).tag(config=True)
@ -224,6 +225,10 @@ class TerminalInteractiveShell(InteractiveShell):
help="Allows to enable/disable the prompt toolkit history search" help="Allows to enable/disable the prompt toolkit history search"
).tag(config=True) ).tag(config=True)
prompt_includes_vi_mode = Bool(True,
help="Display the current vi mode (when using vi editing mode)."
).tag(config=True)
@observe('term_title') @observe('term_title')
def init_term_title(self, change=None): def init_term_title(self, change=None):
# Enable or disable the terminal title. # Enable or disable the terminal title.
@ -257,7 +262,7 @@ class TerminalInteractiveShell(InteractiveShell):
# Set up keyboard shortcuts # Set up keyboard shortcuts
key_bindings = create_ipython_shortcuts(self) key_bindings = create_ipython_shortcuts(self)
# Pre-populate history from yap_ipython's history database # Pre-populate history from IPython's history database
history = InMemoryHistory() history = InMemoryHistory()
last_cell = u"" last_cell = u""
for __, ___, cell in self.history_manager.get_tail(self.history_load_length, for __, ___, cell in self.history_manager.get_tail(self.history_load_length,
@ -283,12 +288,12 @@ class TerminalInteractiveShell(InteractiveShell):
include_default_pygments_style=False, include_default_pygments_style=False,
mouse_support=self.mouse_support, mouse_support=self.mouse_support,
enable_open_in_editor=self.extra_open_editor_shortcuts, enable_open_in_editor=self.extra_open_editor_shortcuts,
color_depth=(ColorDepth.TRUE_COLOR if self.true_color else None), color_depth=self.color_depth,
**self._extra_prompt_options()) **self._extra_prompt_options())
def _make_style_from_name_or_cls(self, name_or_cls): def _make_style_from_name_or_cls(self, name_or_cls):
""" """
Small wrapper that make an yap_ipython compatible style from a style name Small wrapper that make an IPython compatible style from a style name
We need that to add style for prompt ... etc. We need that to add style for prompt ... etc.
""" """
@ -360,6 +365,10 @@ class TerminalInteractiveShell(InteractiveShell):
'readlinelike': CompleteStyle.READLINE_LIKE, 'readlinelike': CompleteStyle.READLINE_LIKE,
}[self.display_completions] }[self.display_completions]
@property
def color_depth(self):
return (ColorDepth.TRUE_COLOR if self.true_color else None)
def _extra_prompt_options(self): def _extra_prompt_options(self):
""" """
Return the current layout option for the current Terminal InteractiveShell Return the current layout option for the current Terminal InteractiveShell
@ -442,7 +451,7 @@ class TerminalInteractiveShell(InteractiveShell):
# need direct access to the console in a way that we can't emulate in # need direct access to the console in a way that we can't emulate in
# GUI or web frontend # GUI or web frontend
if os.name == 'posix': if os.name == 'posix':
for cmd in ['clear', 'more', 'less', 'man']: for cmd in ('clear', 'more', 'less', 'man'):
self.alias_manager.soft_define_alias(cmd, cmd) self.alias_manager.soft_define_alias(cmd, cmd)
@ -462,7 +471,7 @@ class TerminalInteractiveShell(InteractiveShell):
def interact(self, display_banner=DISPLAY_BANNER_DEPRECATED): def interact(self, display_banner=DISPLAY_BANNER_DEPRECATED):
if display_banner is not DISPLAY_BANNER_DEPRECATED: if display_banner is not DISPLAY_BANNER_DEPRECATED:
warn('interact `display_banner` argument is deprecated since yap_ipython 5.0. Call `show_banner()` if needed.', DeprecationWarning, stacklevel=2) warn('interact `display_banner` argument is deprecated since IPython 5.0. Call `show_banner()` if needed.', DeprecationWarning, stacklevel=2)
self.keep_running = True self.keep_running = True
while self.keep_running: while self.keep_running:

View File

@ -1,11 +1,11 @@
#!/usr/bin/env python #!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
""" """
The :class:`~yap_ipython.core.application.Application` object for the command The :class:`~IPython.core.application.Application` object for the command
line :command:`ipython` program. line :command:`ipython` program.
""" """
# Copyright (c) yap_ipython Development Team. # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
@ -16,24 +16,24 @@ import warnings
from traitlets.config.loader import Config from traitlets.config.loader import Config
from traitlets.config.application import boolean_flag, catch_config_error from traitlets.config.application import boolean_flag, catch_config_error
from yap_ipython.core import release from IPython.core import release
from yap_ipython.core import usage from IPython.core import usage
from yap_ipython.core.completer import IPCompleter from IPython.core.completer import IPCompleter
from yap_ipython.core.crashhandler import CrashHandler from IPython.core.crashhandler import CrashHandler
from yap_ipython.core.formatters import PlainTextFormatter from IPython.core.formatters import PlainTextFormatter
from yap_ipython.core.history import HistoryManager from IPython.core.history import HistoryManager
from yap_ipython.core.application import ( from IPython.core.application import (
ProfileDir, BaseYAPApplication, base_flags, base_aliases ProfileDir, BaseIPythonApplication, base_flags, base_aliases
) )
from yap_ipython.core.magics import ( from IPython.core.magics import (
ScriptMagics, LoggingMagics ScriptMagics, LoggingMagics
) )
from yap_ipython.core.shellapp import ( from IPython.core.shellapp import (
InteractiveShellApp, shell_flags, shell_aliases InteractiveShellApp, shell_flags, shell_aliases
) )
from yap_ipython.extensions.storemagic import StoreMagics from IPython.extensions.storemagic import StoreMagics
from .interactiveshell import TerminalInteractiveShell from .interactiveshell import TerminalInteractiveShell
from yap_ipython.paths import get_ipython_dir from IPython.paths import get_ipython_dir
from traitlets import ( from traitlets import (
Bool, List, default, observe, Type Bool, List, default, observe, Type
) )
@ -52,7 +52,7 @@ ipython --profile=foo # start with profile foo
ipython profile create foo # create profile foo w/ default config files ipython profile create foo # create profile foo w/ default config files
ipython help profile # show the help for the profile subcmd ipython help profile # show the help for the profile subcmd
ipython locate # print the path to the yap_ipython directory ipython locate # print the path to the IPython directory
ipython locate profile foo # print the path to the directory for profile `foo` ipython locate profile foo # print the path to the directory for profile `foo`
""" """
@ -61,7 +61,7 @@ ipython locate profile foo # print the path to the directory for profile `foo`
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
class IPAppCrashHandler(CrashHandler): class IPAppCrashHandler(CrashHandler):
"""sys.excepthook for yap_ipython itself, leaves a detailed report on disk.""" """sys.excepthook for IPython itself, leaves a detailed report on disk."""
def __init__(self, app): def __init__(self, app):
contact_name = release.author contact_name = release.author
@ -106,12 +106,12 @@ addflag('simple-prompt', 'TerminalInteractiveShell.simple_prompt',
"Use a rich interactive prompt with prompt_toolkit", "Use a rich interactive prompt with prompt_toolkit",
) )
addflag('banner', 'Terminalyap_ipythonApp.display_banner', addflag('banner', 'TerminalIPythonApp.display_banner',
"Display a banner upon starting yap_ipython.", "Display a banner upon starting IPython.",
"Don't display a banner upon starting yap_ipython." "Don't display a banner upon starting IPython."
) )
addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit', addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
"""Set to confirm when you try to exit yap_ipython with an EOF (Control-D """Set to confirm when you try to exit IPython with an EOF (Control-D
in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit', in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
you can force a direct exit without any confirmation.""", you can force a direct exit without any confirmation.""",
"Don't prompt the user when exiting." "Don't prompt the user when exiting."
@ -123,7 +123,7 @@ addflag('term-title', 'TerminalInteractiveShell.term_title',
classic_config = Config() classic_config = Config()
classic_config.InteractiveShell.cache_size = 0 classic_config.InteractiveShell.cache_size = 0
classic_config.PlainTextFormatter.pprint = False classic_config.PlainTextFormatter.pprint = False
classic_config.TerminalInteractiveShell.prompts_class='yap_ipython.terminal.prompts.ClassicPrompts' classic_config.TerminalInteractiveShell.prompts_class='IPython.terminal.prompts.ClassicPrompts'
classic_config.InteractiveShell.separate_in = '' classic_config.InteractiveShell.separate_in = ''
classic_config.InteractiveShell.separate_out = '' classic_config.InteractiveShell.separate_out = ''
classic_config.InteractiveShell.separate_out2 = '' classic_config.InteractiveShell.separate_out2 = ''
@ -132,7 +132,7 @@ classic_config.InteractiveShell.xmode = 'Plain'
frontend_flags['classic']=( frontend_flags['classic']=(
classic_config, classic_config,
"Gives yap_ipython a similar feel to the classic Python prompt." "Gives IPython a similar feel to the classic Python prompt."
) )
# # log doesn't make so much sense this way anymore # # log doesn't make so much sense this way anymore
# paa('--log','-l', # paa('--log','-l',
@ -141,12 +141,12 @@ frontend_flags['classic']=(
# #
# # quick is harder to implement # # quick is harder to implement
frontend_flags['quick']=( frontend_flags['quick']=(
{'Terminalyap_ipythonApp' : {'quick' : True}}, {'TerminalIPythonApp' : {'quick' : True}},
"Enable quick startup with no config files." "Enable quick startup with no config files."
) )
frontend_flags['i'] = ( frontend_flags['i'] = (
{'Terminalyap_ipythonApp' : {'force_interact' : True}}, {'TerminalIPythonApp' : {'force_interact' : True}},
"""If running code from the command line, become interactive afterwards. """If running code from the command line, become interactive afterwards.
It is often useful to follow this with `--` to treat remaining flags as It is often useful to follow this with `--` to treat remaining flags as
script arguments. script arguments.
@ -162,11 +162,11 @@ aliases.update(shell_aliases)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
class Locateyap_ipythonApp(BaseYAPApplication): class LocateIPythonApp(BaseIPythonApplication):
description = """print the path to the yap_ipython dir""" description = """print the path to the IPython dir"""
subcommands = dict( subcommands = dict(
profile=('yap_ipython.core.profileapp.ProfileLocate', profile=('IPython.core.profileapp.ProfileLocate',
"print the path to an yap_ipython profile directory", "print the path to an IPython profile directory",
), ),
) )
def start(self): def start(self):
@ -176,7 +176,7 @@ class Locateyap_ipythonApp(BaseYAPApplication):
print(self.ipython_dir) print(self.ipython_dir)
class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp): class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
name = u'ipython' name = u'ipython'
description = usage.cl_usage description = usage.cl_usage
crash_handler_class = IPAppCrashHandler crash_handler_class = IPAppCrashHandler
@ -194,7 +194,7 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
@default('classes') @default('classes')
def _classes_default(self): def _classes_default(self):
"""This has to be in a method, for Terminalyap_ipythonApp to be available.""" """This has to be in a method, for TerminalIPythonApp to be available."""
return [ return [
InteractiveShellApp, # ShellApp comes before TerminalApp, because InteractiveShellApp, # ShellApp comes before TerminalApp, because
self.__class__, # it will also affect subclasses (e.g. QtConsole) self.__class__, # it will also affect subclasses (e.g. QtConsole)
@ -210,41 +210,41 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
deprecated_subcommands = dict( deprecated_subcommands = dict(
qtconsole=('qtconsole.qtconsoleapp.JupyterQtConsoleApp', qtconsole=('qtconsole.qtconsoleapp.JupyterQtConsoleApp',
"""DEPRECATED, Will be removed in yap_ipython 6.0 : Launch the Jupyter Qt Console.""" """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter Qt Console."""
), ),
notebook=('notebook.notebookapp.NotebookApp', notebook=('notebook.notebookapp.NotebookApp',
"""DEPRECATED, Will be removed in yap_ipython 6.0 : Launch the Jupyter HTML Notebook Server.""" """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter HTML Notebook Server."""
), ),
console=('jupyter_console.app.ZMQTerminalyap_ipythonApp', console=('jupyter_console.app.ZMQTerminalIPythonApp',
"""DEPRECATED, Will be removed in yap_ipython 6.0 : Launch the Jupyter terminal-based Console.""" """DEPRECATED, Will be removed in IPython 6.0 : Launch the Jupyter terminal-based Console."""
), ),
nbconvert=('nbconvert.nbconvertapp.NbConvertApp', nbconvert=('nbconvert.nbconvertapp.NbConvertApp',
"DEPRECATED, Will be removed in yap_ipython 6.0 : Convert notebooks to/from other formats." "DEPRECATED, Will be removed in IPython 6.0 : Convert notebooks to/from other formats."
), ),
trust=('nbformat.sign.TrustNotebookApp', trust=('nbformat.sign.TrustNotebookApp',
"DEPRECATED, Will be removed in yap_ipython 6.0 : Sign notebooks to trust their potentially unsafe contents at load." "DEPRECATED, Will be removed in IPython 6.0 : Sign notebooks to trust their potentially unsafe contents at load."
), ),
kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp', kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp',
"DEPRECATED, Will be removed in yap_ipython 6.0 : Manage Jupyter kernel specifications." "DEPRECATED, Will be removed in IPython 6.0 : Manage Jupyter kernel specifications."
), ),
) )
subcommands = dict( subcommands = dict(
profile = ("yap_ipython.core.profileapp.ProfileApp", profile = ("IPython.core.profileapp.ProfileApp",
"Create and manage yap_ipython profiles." "Create and manage IPython profiles."
), ),
kernel = ("ipykernel.kernelapp.IPKernelApp", kernel = ("ipykernel.kernelapp.IPKernelApp",
"Start a kernel without an attached frontend." "Start a kernel without an attached frontend."
), ),
locate=('yap_ipython.terminal.ipapp.Locateyap_ipythonApp', locate=('IPython.terminal.ipapp.LocateIPythonApp',
Locateyap_ipythonApp.description LocateIPythonApp.description
), ),
history=('yap_ipython.core.historyapp.HistoryApp', history=('IPython.core.historyapp.HistoryApp',
"Manage the yap_ipython history database." "Manage the IPython history database."
), ),
) )
deprecated_subcommands['install-nbextension'] = ( deprecated_subcommands['install-nbextension'] = (
"notebook.nbextensions.InstallNBExtensionApp", "notebook.nbextensions.InstallNBExtensionApp",
"DEPRECATED, Will be removed in yap_ipython 6.0 : Install Jupyter notebook extension files" "DEPRECATED, Will be removed in IPython 6.0 : Install Jupyter notebook extension files"
) )
subcommands.update(deprecated_subcommands) subcommands.update(deprecated_subcommands)
@ -252,7 +252,7 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
auto_create=Bool(True) auto_create=Bool(True)
# configurables # configurables
quick = Bool(False, quick = Bool(False,
help="""Start yap_ipython quickly by skipping the loading of config files.""" help="""Start IPython quickly by skipping the loading of config files."""
).tag(config=True) ).tag(config=True)
@observe('quick') @observe('quick')
def _quick_changed(self, change): def _quick_changed(self, change):
@ -260,7 +260,7 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
self.load_config_file = lambda *a, **kw: None self.load_config_file = lambda *a, **kw: None
display_banner = Bool(True, display_banner = Bool(True,
help="Whether to display a banner upon starting yap_ipython." help="Whether to display a banner upon starting IPython."
).tag(config=True) ).tag(config=True)
# if there is code of files to run from the cmd line, don't interact # if there is code of files to run from the cmd line, don't interact
@ -300,12 +300,12 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
" Use `--matplotlib <backend>` and import pylab manually.") " Use `--matplotlib <backend>` and import pylab manually.")
argv[idx] = '--pylab' argv[idx] = '--pylab'
return super(Terminalyap_ipythonApp, self).parse_command_line(argv) return super(TerminalIPythonApp, self).parse_command_line(argv)
@catch_config_error @catch_config_error
def initialize(self, argv=None): def initialize(self, argv=None):
"""Do actions after construct, but before starting the app.""" """Do actions after construct, but before starting the app."""
super(Terminalyap_ipythonApp, self).initialize(argv) super(TerminalIPythonApp, self).initialize(argv)
if self.subapp is not None: if self.subapp is not None:
# don't bother initializing further, starting subapp # don't bother initializing further, starting subapp
return return
@ -352,10 +352,10 @@ class Terminalyap_ipythonApp(BaseYAPApplication, InteractiveShellApp):
return self.subapp.start() return self.subapp.start()
# perform any prexec steps: # perform any prexec steps:
if self.interact: if self.interact:
self.log.debug("Starting yap_ipython's mainloop...") self.log.debug("Starting IPython's mainloop...")
self.shell.mainloop() self.shell.mainloop()
else: else:
self.log.debug("yap_ipython not interactive...") self.log.debug("IPython not interactive...")
if not self.shell.last_execution_succeeded: if not self.shell.last_execution_succeeded:
sys.exit(1) sys.exit(1)
@ -368,12 +368,12 @@ def load_default_config(ipython_dir=None):
ipython_dir = get_ipython_dir() ipython_dir = get_ipython_dir()
profile_dir = os.path.join(ipython_dir, 'profile_default') profile_dir = os.path.join(ipython_dir, 'profile_default')
app = Terminalyap_ipythonApp() app = TerminalIPythonApp()
app.config_file_paths.append(profile_dir) app.config_file_paths.append(profile_dir)
app.load_config_file() app.load_config_file()
return app.config return app.config
launch_new_instance = Terminalyap_ipythonApp.launch_instance launch_new_instance = TerminalIPythonApp.launch_instance
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,6 +1,6 @@
"""Extra magics for terminal use.""" """Extra magics for terminal use."""
# Copyright (c) yap_ipython Development Team. # Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
@ -8,11 +8,11 @@ from logging import error
import os import os
import sys import sys
from yap_ipython.core.error import TryNext, UsageError from IPython.core.error import TryNext, UsageError
from yap_ipython.core.magic import Magics, magics_class, line_magic from IPython.core.magic import Magics, magics_class, line_magic
from yap_ipython.lib.clipboard import ClipboardEmpty from IPython.lib.clipboard import ClipboardEmpty
from yap_ipython.utils.text import SList, strip_email_quotes from IPython.utils.text import SList, strip_email_quotes
from yap_ipython.utils import py3compat from IPython.utils import py3compat
def get_pasted_lines(sentinel, l_input=py3compat.input, quiet=False): def get_pasted_lines(sentinel, l_input=py3compat.input, quiet=False):
""" Yield pasted lines until the user enters the given sentinel value. """ Yield pasted lines until the user enters the given sentinel value.
@ -109,7 +109,7 @@ class TerminalMagics(Magics):
Just press enter and type -- (and press enter again) and the block Just press enter and type -- (and press enter again) and the block
will be what was just pasted. will be what was just pasted.
yap_ipython statements (magics, shell escapes) are not supported (yet). IPython statements (magics, shell escapes) are not supported (yet).
See also See also
-------- --------
@ -162,7 +162,7 @@ class TerminalMagics(Magics):
-q: quiet mode: do not echo the pasted text back to the terminal. -q: quiet mode: do not echo the pasted text back to the terminal.
yap_ipython statements (magics, shell escapes) are not supported (yet). IPython statements (magics, shell escapes) are not supported (yet).
See also See also
-------- --------

View File

@ -3,7 +3,7 @@
from pygments.token import Token from pygments.token import Token
import sys import sys
from yap_ipython.core.displayhook import DisplayHook from IPython.core.displayhook import DisplayHook
from prompt_toolkit.formatted_text import fragment_list_width, PygmentsTokens from prompt_toolkit.formatted_text import fragment_list_width, PygmentsTokens
from prompt_toolkit.shortcuts import print_formatted_text from prompt_toolkit.shortcuts import print_formatted_text
@ -14,9 +14,8 @@ class Prompts(object):
self.shell = shell self.shell = shell
def vi_mode(self): def vi_mode(self):
if not hasattr(self.shell.pt_app, 'editing_mode'): if (getattr(self.shell.pt_app, 'editing_mode', None) == 'VI'
return '' and self.shell.prompt_includes_vi_mode):
if self.shell.pt_app.editing_mode == 'VI':
return '['+str(self.shell.pt_app.app.vi_state.input_mode)[3:6]+'] ' return '['+str(self.shell.pt_app.app.vi_state.input_mode)[3:6]+'] '
return '' return ''

View File

@ -19,12 +19,16 @@ from prompt_toolkit.lexers import PygmentsLexer
from prompt_toolkit.patch_stdout import patch_stdout from prompt_toolkit.patch_stdout import patch_stdout
import pygments.lexers as pygments_lexers import pygments.lexers as pygments_lexers
import os
_completion_sentinel = object() _completion_sentinel = object()
def _elide(string, *, min_elide=30): def _elide(string, *, min_elide=30):
""" """
If a string is long enough, and has at least 2 dots, If a string is long enough, and has at least 3 dots,
replace the middle part with ellipses.
If a string naming a file is long enough, and has at least 3 slashes,
replace the middle part with ellipses. replace the middle part with ellipses.
If three consecutive dots, or two consecutive dots are encountered these are If three consecutive dots, or two consecutive dots are encountered these are
@ -36,16 +40,20 @@ def _elide(string, *, min_elide=30):
if len(string) < min_elide: if len(string) < min_elide:
return string return string
parts = string.split('.') object_parts = string.split('.')
file_parts = string.split(os.sep)
if len(object_parts) > 3:
return '{}.{}\N{HORIZONTAL ELLIPSIS}{}.{}'.format(object_parts[0], object_parts[1][0], object_parts[-2][-1], object_parts[-1])
elif len(file_parts) > 3:
return ('{}' + os.sep + '{}\N{HORIZONTAL ELLIPSIS}{}' + os.sep + '{}').format(file_parts[0], file_parts[1][0], file_parts[-2][-1], file_parts[-1])
if len(parts) <= 3:
return string return string
return '{}.{}\N{HORIZONTAL ELLIPSIS}{}.{}'.format(parts[0], parts[1][0], parts[-2][-1], parts[-1])
def _adjust_completion_text_based_on_context(text, body, offset): def _adjust_completion_text_based_on_context(text, body, offset):
if text.endswith('=') and len(body) > offset and body[offset] is '=': if text.endswith('=') and len(body) > offset and body[offset] == '=':
return text[:-1] return text[:-1]
else: else:
return text return text

View File

@ -17,6 +17,9 @@ from IPython.core.inputtransformer import *
from IPython.core.interactiveshell import * from IPython.core.interactiveshell import *
from ipython_genutils.py3compat import builtin_mod from ipython_genutils.py3compat import builtin_mod
import copy
import json
from yap_kernel.displayhook import ZMQShellDisplayHook from yap_kernel.displayhook import ZMQShellDisplayHook
import traceback import traceback
@ -229,6 +232,7 @@ class YAPInputSplitter(InputSplitter):
transformed_lines_list.append(transformed) transformed_lines_list.append(transformed)
if transformed_lines_list: if transformed_lines_list:
transformed_lines = '\n'.join(transformed_lines_list) transformed_lines = '\n'.join(transformed_lines_list)
else: else:
# Got nothing back from transformers - they must be waiting for # Got nothing back from transformers - they must be waiting for
# more input. # more input.
@ -551,23 +555,30 @@ class YAPRun(InteractiveShell):
self.query.close() self.query.close()
self.query = None self.query = None
self.answers = [] self.answers = []
result.result = []
self.os = (program,squery) self.os = (program,squery)
self.iterations = 0 self.iterations = 0
pg = jupyter_query(self.engine,program,squery) pg = jupyter_query(self.engine,program,squery)
self.query = Query(self.engine, pg) self.query = Query(self.engine, pg)
self.answers = [] self.answers = []
for answer in self.query: for answer in self.query:
self.answers += [answer] print( answer )
self.answers += [copy.deepcopy(answer)]
self.iterations += 1 self.iterations += 1
self.os = None self.os = None
self.query.close() self.query.close()
self.query = None self.query = None
if self.answers: if self.answers:
sys.stderr.write('Completed, with '+str(self.answers)+'\n') sys.stderr.write('\n'+'[ ' +str(len(self.answers))+' answer(s): ]\n[ ')
result.result = self.answers print( self.answers )
result.result = json.dumps(self.answers)
sys.stderr.write(result.result+' ]\n\n')
else:
result.result = []
return result.result return result.result
except Exception as e: except Exception as e:
sys.stderr.write('Exception '+str(e)+'in query '+ str(self.query)+ sys.stderr.write('Exception '+str(e)+'in query '+ str(self.query)+
'\n '+str( self.bindings)+ '\n') '\n '+str( self.bindings)+ '\n')

View File

@ -444,11 +444,10 @@ be lost.
'$trace_plan'((A|B), M, CP, S, (EA|EB)) :- !, '$trace_plan'((A|B), M, CP, S, (EA|EB)) :- !,
'$trace_plan'(A, M, CP, S, EA), '$trace_plan'(A, M, CP, S, EA),
'$trace_plan'(B, M, CP, S, EB). '$trace_plan'(B, M, CP, S, EB).
'$trace_plan'(C, M, CP, S, EC), '$trace_plan'((A*->B), M, CP, S, (EA->EB)) :- !,
'$trace_plan'((A->*B), M, CP, S, (EA->EB)) :- !,
'$trace_plan'(A, M, CP, S, EA), '$trace_plan'(A, M, CP, S, EA),
'$trace_plan'(B, M, CP, S, EB). '$trace_plan'(B, M, CP, S, EB).
'$trace_plan'((A->*B;C), M, CP, S, (EA->EB;EC)) :- !, '$trace_plan'((A*->B;C), M, CP, S, (EA->EB;EC)) :- !,
'$trace_plan'(A, M, CP, S, EA), '$trace_plan'(A, M, CP, S, EA),
'$trace_plan'(B, M, CP, S, EB), '$trace_plan'(B, M, CP, S, EB),
'$trace_plan'(C, M, CP, S, EC). '$trace_plan'(C, M, CP, S, EC).
@ -473,7 +472,7 @@ be lost.
%% @pred $trace_goal( +Goal, +Module, +CallId, +CallInfo) %% @pred $trace_goal( +Goal, +Module, +CallId, +CallInfo)
%% %%
%% Actuallb sy debugs a %% Actually debugs a
%% goal! %% goal!
'$trace_goal'(G, M, GoalNumber, _H) :- '$trace_goal'(G, M, GoalNumber, _H) :-
( (

View File

@ -39,7 +39,7 @@ fail.
true true
; ;
%% this should have been caught before %% this should have been caught before
'$is_system_predicate'(G, prolog) '$is_system_predicate'(G, ImportingMod)
-> ->
true true
; ;
@ -113,7 +113,7 @@ fail.
'$autoloader_find_predicate'(G0,ExportingMod), '$autoloader_find_predicate'(G0,ExportingMod),
ExportingMod \= ImportingMod, ExportingMod \= ImportingMod,
(recordzifnot('$import','$import'(ExportingMod,ImportingMod,G0,G0, N ,K),_), (recordzifnot('$import','$import'(ExportingMod,ImportingMod,G0,G0, N ,K),_),
\+ '$system_predicate'(G0,prolog) \+ '$is_system_predicate'(G0, ExportingMod)
-> ->
'$compile'((G:-ExportingMod:G0), reconsult ,(ImportingMod:G:-ExportingMod:G0), ImportingMod, _) '$compile'((G:-ExportingMod:G0), reconsult ,(ImportingMod:G:-ExportingMod:G0), ImportingMod, _)
; ;
@ -133,7 +133,7 @@ fail.
yap_flag(autoload, _, true), yap_flag(autoload, _, true),
yap_flag( unknown, _, Unknown), yap_flag( unknown, _, Unknown),
yap_flag( debug, _, Debug), yap_flag( debug, _, Debug),
autoloader:find_predicate(G,ExportingMod). setup_autoloader:find_predicate(G,ExportingMod).

View File

@ -426,6 +426,8 @@ extra_info( error(_,Info), _ ) -->
{ '$error_descriptor'(Info, Desc) }, { '$error_descriptor'(Info, Desc) },
{ {
query_exception(errorMsg, Desc, Msg), query_exception(errorMsg, Desc, Msg),
Msg \= '',
Msg \= "",
Msg \= [] Msg \= []
}, },
!, !,
@ -434,6 +436,7 @@ extra_info( error(_,Info), _ ) -->
extra_info( _, _ ) --> extra_info( _, _ ) -->
[]. [].
stack_info( _, _ ) --> !.
stack_info( error(_,Info), _ ) --> stack_info( error(_,Info), _ ) -->
{ '$error_descriptor'(Info, Desc) }, { '$error_descriptor'(Info, Desc) },
{ {

View File

@ -57,9 +57,17 @@ prolog:'$protect' :-
\+ '$visible'(Name), \+ '$visible'(Name),
hide_atom(Name), hide_atom(Name),
fail. fail.
prolog:'$protect' :-
recorded('$module','$module'(_F,_DonorM,_SourceF, _AllExports, _Line), R),erase(R), fail.
prolog:'$protect' :-
recorded('$source_file','$source_file'( _F, _Age, _M), R),erase(R), fail.
prolog:'$protect' :-
recorded('$lf_loaded','$lf_loaded'( _F, _M, _Reconsult, _UserFile, _OldF, _Line, _Opts), R),erase(R), fail.
prolog:'$protect'. prolog:'$protect'.
/*
% hide all atoms who start by '$' % hide all atoms who start by '$'
'$visible'('$'). /* not $VAR */ '$visible'('$'). /* not $VAR */
'$visible'('$VAR'). /* not $VAR */ '$visible'('$VAR'). /* not $VAR */