This commit is contained in:
Vitor Santos Costa 2018-07-27 11:11:04 +01:00
parent 436f1c205a
commit bf712034a9
18 changed files with 333 additions and 249 deletions

View File

@ -37,6 +37,7 @@ A BeginCurlyBracket N "{"
A EndCurlyBracket N "}" A EndCurlyBracket N "}"
A EmptyBrackets N "()" A EmptyBrackets N "()"
A EmptySquareBrackets N "[]" A EmptySquareBrackets N "[]"
A As N "as"
A Asserta N "asserta" A Asserta N "asserta"
A AssertaStatic N "asserta_static" A AssertaStatic N "asserta_static"
A Assertz N "assertz" A Assertz N "assertz"
@ -458,6 +459,7 @@ F Arg Arg 3
F ArrayEntry ArrayAccess 3 F ArrayEntry ArrayAccess 3
F Arrow Arrow 2 F Arrow Arrow 2
F DoubleArrow DoubleArrow 2 F DoubleArrow DoubleArrow 2
F As As 2
F Assert1 Assert 1 F Assert1 Assert 1
F Assert Assert 2 F Assert Assert 2
F AtFoundOne FoundVar 2 F AtFoundOne FoundVar 2

View File

@ -32,6 +32,7 @@
AtomEndCurlyBracket = Yap_LookupAtom("}"); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket); AtomEndCurlyBracket = Yap_LookupAtom("}"); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket);
AtomEmptyBrackets = Yap_LookupAtom("()"); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets); AtomEmptyBrackets = Yap_LookupAtom("()"); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets);
AtomEmptySquareBrackets = Yap_LookupAtom("[]"); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets); AtomEmptySquareBrackets = Yap_LookupAtom("[]"); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets);
AtomAs = Yap_LookupAtom("as"); TermAs = MkAtomTerm(AtomAs);
AtomAsserta = Yap_LookupAtom("asserta"); TermAsserta = MkAtomTerm(AtomAsserta); AtomAsserta = Yap_LookupAtom("asserta"); TermAsserta = MkAtomTerm(AtomAsserta);
AtomAssertaStatic = Yap_LookupAtom("asserta_static"); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic); AtomAssertaStatic = Yap_LookupAtom("asserta_static"); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic);
AtomAssertz = Yap_LookupAtom("assertz"); TermAssertz = MkAtomTerm(AtomAssertz); AtomAssertz = Yap_LookupAtom("assertz"); TermAssertz = MkAtomTerm(AtomAssertz);
@ -453,6 +454,7 @@
FunctorArrayEntry = Yap_MkFunctor(AtomArrayAccess,3); FunctorArrayEntry = Yap_MkFunctor(AtomArrayAccess,3);
FunctorArrow = Yap_MkFunctor(AtomArrow,2); FunctorArrow = Yap_MkFunctor(AtomArrow,2);
FunctorDoubleArrow = Yap_MkFunctor(AtomDoubleArrow,2); FunctorDoubleArrow = Yap_MkFunctor(AtomDoubleArrow,2);
FunctorAs = Yap_MkFunctor(AtomAs,2);
FunctorAssert1 = Yap_MkFunctor(AtomAssert,1); FunctorAssert1 = Yap_MkFunctor(AtomAssert,1);
FunctorAssert = Yap_MkFunctor(AtomAssert,2); FunctorAssert = Yap_MkFunctor(AtomAssert,2);
FunctorAtFoundOne = Yap_MkFunctor(AtomFoundVar,2); FunctorAtFoundOne = Yap_MkFunctor(AtomFoundVar,2);

View File

@ -32,6 +32,7 @@
AtomEndCurlyBracket = AtomAdjust(AtomEndCurlyBracket); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket); AtomEndCurlyBracket = AtomAdjust(AtomEndCurlyBracket); TermEndCurlyBracket = MkAtomTerm(AtomEndCurlyBracket);
AtomEmptyBrackets = AtomAdjust(AtomEmptyBrackets); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets); AtomEmptyBrackets = AtomAdjust(AtomEmptyBrackets); TermEmptyBrackets = MkAtomTerm(AtomEmptyBrackets);
AtomEmptySquareBrackets = AtomAdjust(AtomEmptySquareBrackets); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets); AtomEmptySquareBrackets = AtomAdjust(AtomEmptySquareBrackets); TermEmptySquareBrackets = MkAtomTerm(AtomEmptySquareBrackets);
AtomAs = AtomAdjust(AtomAs); TermAs = MkAtomTerm(AtomAs);
AtomAsserta = AtomAdjust(AtomAsserta); TermAsserta = MkAtomTerm(AtomAsserta); AtomAsserta = AtomAdjust(AtomAsserta); TermAsserta = MkAtomTerm(AtomAsserta);
AtomAssertaStatic = AtomAdjust(AtomAssertaStatic); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic); AtomAssertaStatic = AtomAdjust(AtomAssertaStatic); TermAssertaStatic = MkAtomTerm(AtomAssertaStatic);
AtomAssertz = AtomAdjust(AtomAssertz); TermAssertz = MkAtomTerm(AtomAssertz); AtomAssertz = AtomAdjust(AtomAssertz); TermAssertz = MkAtomTerm(AtomAssertz);
@ -453,6 +454,7 @@
FunctorArrayEntry = FuncAdjust(FunctorArrayEntry); FunctorArrayEntry = FuncAdjust(FunctorArrayEntry);
FunctorArrow = FuncAdjust(FunctorArrow); FunctorArrow = FuncAdjust(FunctorArrow);
FunctorDoubleArrow = FuncAdjust(FunctorDoubleArrow); FunctorDoubleArrow = FuncAdjust(FunctorDoubleArrow);
FunctorAs = FuncAdjust(FunctorAs);
FunctorAssert1 = FuncAdjust(FunctorAssert1); FunctorAssert1 = FuncAdjust(FunctorAssert1);
FunctorAssert = FuncAdjust(FunctorAssert); FunctorAssert = FuncAdjust(FunctorAssert);
FunctorAtFoundOne = FuncAdjust(FunctorAtFoundOne); FunctorAtFoundOne = FuncAdjust(FunctorAtFoundOne);

View File

@ -32,6 +32,7 @@ X_API EXTERNAL Atom AtomBeginCurlyBracket; X_API EXTERNAL Term TermBeginCurlyBra
X_API EXTERNAL Atom AtomEndCurlyBracket; X_API EXTERNAL Term TermEndCurlyBracket; X_API EXTERNAL Atom AtomEndCurlyBracket; X_API EXTERNAL Term TermEndCurlyBracket;
X_API EXTERNAL Atom AtomEmptyBrackets; X_API EXTERNAL Term TermEmptyBrackets; X_API EXTERNAL Atom AtomEmptyBrackets; X_API EXTERNAL Term TermEmptyBrackets;
X_API EXTERNAL Atom AtomEmptySquareBrackets; X_API EXTERNAL Term TermEmptySquareBrackets; X_API EXTERNAL Atom AtomEmptySquareBrackets; X_API EXTERNAL Term TermEmptySquareBrackets;
X_API EXTERNAL Atom AtomAs; X_API EXTERNAL Term TermAs;
X_API EXTERNAL Atom AtomAsserta; X_API EXTERNAL Term TermAsserta; X_API EXTERNAL Atom AtomAsserta; X_API EXTERNAL Term TermAsserta;
X_API EXTERNAL Atom AtomAssertaStatic; X_API EXTERNAL Term TermAssertaStatic; X_API EXTERNAL Atom AtomAssertaStatic; X_API EXTERNAL Term TermAssertaStatic;
X_API EXTERNAL Atom AtomAssertz; X_API EXTERNAL Term TermAssertz; X_API EXTERNAL Atom AtomAssertz; X_API EXTERNAL Term TermAssertz;
@ -461,6 +462,8 @@ X_API EXTERNAL Functor FunctorArrow;
X_API EXTERNAL Functor FunctorDoubleArrow; X_API EXTERNAL Functor FunctorDoubleArrow;
X_API EXTERNAL Functor FunctorAs;
X_API EXTERNAL Functor FunctorAssert1; X_API EXTERNAL Functor FunctorAssert1;
X_API EXTERNAL Functor FunctorAssert; X_API EXTERNAL Functor FunctorAssert;

View File

@ -3,9 +3,9 @@
(function(mod) { (function(mod) {
if (typeof exports == "object" && typeof module == "object") // CommonJS if (typeof exports == "object" && typeof module == "object") // CommonJS
mod(require("../../lib/codemirror")); mod(require("codemirror/lib/codemirror"));
else if (typeof define == "function" && define.amd) // AMD else if (typeof define == "function" && define.amd) // AMD
define(["../../lib/codemirror"], mod); define(["codemirror/lib/codemirror"], mod);
else // Plain browser env else // Plain browser env
mod(CodeMirror); mod(CodeMirror);
})(function(CodeMirror) { })(function(CodeMirror) {
@ -23,12 +23,13 @@
*******************************/ *******************************/
var config = { quasiQuotations: false, /* {|Syntax||Quotation|} */ var config = { quasiQuotations: false, /* {|Syntax||Quotation|} */
indot: true, /* a.b */
dicts: false, /* tag{k:v, ...} */ dicts: false, /* tag{k:v, ...} */
unicodeEscape: true, /* \uXXXX and \UXXXXXXXX */ unicodeEscape: true, /* \uXXXX and \UXXXXXXXX */
multiLineQuoted: true, /* "...\n..." */ multiLineQuoted: true, /* "...\n..." */
groupedIntegers: false /* 10 000 or 10_000 */ groupedIntegers: false /* 10 000 or 10_000 */
}; };
v
var quoteType = { '"': "string", var quoteType = { '"': "string",
"'": "qatom", "'": "qatom",
"`": "bqstring" "`": "bqstring"
@ -1216,8 +1217,7 @@
token: function(stream, state) { token: function(stream, state) {
var nest; var nest;
if ( state.curTerm == null && mode if ( state.curTerm == null && modeConfig.metainfo ) {
Config.metainfo ) {
state.curTerm = 0; state.curTerm = 0;
state.curToken = 0; state.curToken = 0;
} }

View File

@ -1,3 +1,6 @@
// CodeMirror, copyright (c) by Marijn Haverbeke and others // CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE // Distributed under an MIT license: http://codemirror.net/LICENSE
@ -11,7 +14,7 @@ else // Plain browser env
})(function(CodeMirror) { })(function(CodeMirror) {
"use strict"; "use strict";
CodeMirror.defineMode("prolog", function(cm_config, parserConfig) { CodeMirror.defineMode("prolog", function(conf, parserConfig) {
function chain(stream, state, f) { function chain(stream, state, f) {
state.tokenize = f; state.tokenize = f;
@ -19,18 +22,18 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
/******************************* /*******************************
* CONFIG DATA * * CONFIG DATA *
*******************************/ *******************************/
var config = { var quasiQuotations =
quasiQuotations : false, /* {|Syntax||Quotation|} */ parserConfig.quasiQuotations || false; /* {|Syntax||Quotation|} */
dicts : false, /* tag{k:v, ...} */ var dicts = parserConfig.dicts || false; /* tag{k:v, ...} */
unicodeEscape : true, /* \uXXXX and \UXXXXXXXX */ var groupedIntegers = parserConfig.groupedIntegers || false; /* tag{k:v, ...} */
multiLineQuoted : true, /* "...\n..." */ var unicodeEscape =
groupedIntegers : false /* 10 000 or 10_000 */ parserConfig.unicodeEscape || true; /* \uXXXX and \UXXXXXXXX */
}; var multiLineQuoted = parserConfig.multiLineQuoted || true; /* "...\n..." */
var quoteType = parserConfig.quoteType ||
var quoteType = {'"' : "string", "'" : "qatom", "`" : "bqstring"}; {'"' : "string", "'" : "qatom", "`" : "bqstring"};
var isSingleEscChar = /[abref\\'"nrtsv]/; var isSingleEscChar = /[abref\\'"nrtsv]/;
var isOctalDigit = /[0-7]/; var isOctalDigit = /[0-7]/;
@ -42,7 +45,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
var isControlOp = /^(,|;|->|\*->|\\+|\|)$/; var isControlOp = /^(,|;|->|\*->|\\+|\|)$/;
/******************************* /*******************************
* CHARACTER ESCAPES * * CHARACTER ESCAPES *
*******************************/ *******************************/
function readDigits(stream, re, count) { function readDigits(stream, re, count) {
@ -64,11 +67,11 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
return true; return true;
switch (next) { switch (next) {
case "u": case "u":
if (config.unicodeEscape) if (unicodeEscape)
return readDigits(stream, isHexDigit, 4); /* SWI */ return readDigits(stream, isHexDigit, conf.indentUnit); /* SWI */
return false; return false;
case "U": case "U":
if (config.unicodeEscape) if (unicodeEscape)
return readDigits(stream, isHexDigit, 8); /* SWI */ return readDigits(stream, isHexDigit, 8); /* SWI */
return false; return false;
case null: case null:
@ -101,11 +104,11 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
return false; return false;
} }
} }
return config.multiLineQuoted; return multiLineQuoted;
} }
/******************************* /*******************************
* CONTEXT NESTING * * CONTEXT NESTING *
*******************************/ *******************************/
function nesting(state) { return state.nesting.slice(-1)[0]; } function nesting(state) { return state.nesting.slice(-1)[0]; }
@ -126,7 +129,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
var nest = nesting(state); var nest = nesting(state);
if (nest && !nest.alignment && nest.arg != undefined) { if (nest && !nest.alignment && nest.arg != undefined) {
if (nest.arg == 0) if (nest.arg == 0)
nest.alignment = nest.leftCol ? nest.leftCol + 4 : nest.column + 4; nest.alignment = nest.leftCol ? nest.leftCol + conf.indentUnit : nest.column + conf.indentUnit;
else else
nest.alignment = nest.column + 1; nest.alignment = nest.column + 1;
} }
@ -158,10 +161,10 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// Used as scratch variables to communicate multiple values without // Used as scratch variables to communicate multiple values without
// consing up tons of objects. // consing up tons of objects.
var type, content; var type;//, content;
function ret(tp, style, cont) { function ret(tp, style, cont) {
type = tp; type = tp;
content = cont; // content = cont;
return style; return style;
} }
@ -172,7 +175,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
/******************************* /*******************************
* SUB TOKENISERS * * SUB TOKENISERS *
*******************************/ *******************************/
function plTokenBase(stream, state) { function plTokenBase(stream, state) {
@ -192,7 +195,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
state.nesting.push({ state.nesting.push({
type : "control", type : "control",
closeColumn : stream.column(), closeColumn : stream.column(),
alignment : stream.column() + 4 alignment : stream.column() + conf.indentUnit
}); });
} }
return ret("solo", null, "("); return ret("solo", null, "(");
@ -258,7 +261,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
return ret("list_open", "bracket"); return ret("list_open", "bracket");
break; break;
case "{": case "{":
if (config.quasiQuotations && stream.eat("|")) { if (quasiQuotations && stream.eat("|")) {
state.nesting.push( state.nesting.push(
{type : "quasi-quotation", alignment : stream.column() + 1}); {type : "quasi-quotation", alignment : stream.column() + 1});
return ret("qq_open", "bracket"); return ret("qq_open", "bracket");
@ -272,7 +275,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
break; break;
case "|": case "|":
if (config.quasiQuotations) { if (quasiQuotations) {
if (stream.eat("|")) { if (stream.eat("|")) {
state.tokenize = plTokenQuasiQuotation; state.tokenize = plTokenQuasiQuotation;
return ret("qq_sep", "bracket"); return ret("qq_sep", "bracket");
@ -314,7 +317,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
if (/\d/.test(ch) || /[+-]/.test(ch) && stream.eat(/\d/)) { if (/\d/.test(ch) || /[+-]/.test(ch) && stream.eat(/\d/)) {
if (config.groupedIntegers) if (groupedIntegers)
stream.match(/^\d*((_|\s+)\d+)*(?:\.\d+)?(?:[eE][+\-]?\d+)?/); stream.match(/^\d*((_|\s+)\d+)*(?:\.\d+)?(?:[eE][+\-]?\d+)?/);
else else
stream.match(/^\d*(?:\.\d+)?(?:[eE][+\-]?\d+)?/); stream.match(/^\d*(?:\.\d+)?(?:[eE][+\-]?\d+)?/);
@ -342,8 +345,9 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
stream.eatWhile(/[\w_]/); stream.eatWhile(/[\w_]/);
var word = stream.current(), extra = ""; var word = stream.current();
if (stream.peek() == "{" && config.dicts) { var extra = "";
if (stream.peek() == "{" && dicts) {
state.tagName = word; /* tmp state extension */ state.tagName = word; /* tmp state extension */
state.tagColumn = stream.column(); state.tagColumn = stream.column();
return ret("tag", "tag", word); return ret("tag", "tag", word);
@ -407,7 +411,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
return ret("functor", "atom", word); return ret("functor", "atom", word);
} }
if (stream.peek() == "{" && config.dicts) { /* 'quoted tag'{} */ if (stream.peek() == "{" && dicts) { /* 'quoted tag'{} */
var word = stream.current(); var word = stream.current();
state.tagName = word; /* tmp state extension */ state.tagName = word; /* tmp state extension */
return ret("tag", "tag", word); return ret("tag", "tag", word);
@ -443,7 +447,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
} }
// /******************************* // /*******************************
// * ACTIVE KEYS * // * ACTIVE KEYS *
// *******************************/ // *******************************/
// /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -451,7 +455,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// Support if-then-else layout like this: // Support if-then-else layout like this:
// goal :- // goal :-
// ( Condition // ( Condition
// -> IfTrue // -> IfTrue
// ; IfFalse // ; IfFalse
// ). // ).
@ -464,7 +468,7 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// if ( token.state.goalStart == true ) // if ( token.state.goalStart == true )
// { cm.replaceSelection("( ", "end"); // { cm.replaceSelection("( ", "end");
// return; // return;
// } // }
// return CodeMirror.Pass; // return CodeMirror.Pass;
@ -475,32 +479,32 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// var token = cm.getTokenAt(start, true); // var token = cm.getTokenAt(start, true);
// /* FIXME: These functions are copied from prolog.js. How // /* FIXME: These functions are copied from prolog.js. How
// can we reuse these? // can we reuse these?
// */ // */
// function nesting(state) { // function nesting(state) {
// var len = state.nesting.length; // var len = state.nesting.length;
// if ( len > 0 ) // if ( len > 0 )
// return state.nesting[len-1]; // return state.nesting[len-1];
// return null; // return null;
// } // }
// function isControl(state) { /* our terms are goals */ // function isControl(state) { /* our terms are goals */
// var nest = nesting(state); // var nest = nesting(state);
// if ( nest ) { // if ( nest ) {
// if ( nest.type == "control" ) { // if ( nest.type == "control" ) {
// return true; // return true;
// } // }
// return false; // return false;
// } else // } else
// return state.inBody; // return state.inBody;
// } // }
// if ( start.ch == token.end && // if ( start.ch == token.end &&
// token.type == "operator" && // token.type == "operator" &&
// token.string == "-" && // token.string == "-" &&
// isControl(token.state) ) // isControl(token.state) )
// { cm.replaceSelection("> ", "end"); // { cm.replaceSelection("> ", "end");
// return; // return;
// } // }
// return CodeMirror.Pass; // return CodeMirror.Pass;
@ -511,9 +515,9 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// var token = cm.getTokenAt(start, true); // var token = cm.getTokenAt(start, true);
// if ( token.start == 0 && start.ch == token.end && // if ( token.start == 0 && start.ch == token.end &&
// !/\S/.test(token.string) ) // !/\S/.test(token.string) )
// { cm.replaceSelection("; ", "end"); // { cm.replaceSelection("; ", "end");
// return; // return;
// } // }
// return CodeMirror.Pass; // return CodeMirror.Pass;
@ -521,15 +525,15 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
// CodeMirror.defineOption("prologKeys", null, function(cm, val, prev) { // CodeMirror.defineOption("prologKeys", null, function(cm, val, prev) {
// if (prev && prev != CodeMirror.Init) // if (prev && prev != CodeMirror.Init)
// cm.removeKeyMap("prolog"); // cm.removeKeyMap("prolog");
// if ( val ) { // if ( val ) {
// var map = { name: "prolog", // var map = { name: "prolog",
// "'('": "prologStartIfThenElse", // "'('": "prologStartIfThenElse",
// "'>'": "prologStartThen", // "'>'": "prologStartThen",
// "';'": "prologStartElse", // "';'": "prologStartElse",
// "Ctrl-L": "refreshHighlight" // "Ctrl-L": "refreshHighlight"
// }; // };
// cm.addKeyMap(map); // cm.addKeyMap(map);
// } // }
// }); // });
@ -606,32 +610,6 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
"\\" : {p : 200, t : "fy"} "\\" : {p : 200, t : "fy"}
}; };
var translType = {
"comment" : "comment",
"var" : "variable-2", /* JavaScript Types */
"atom" : "atom",
"qatom" : "atom",
"bqstring" : "string",
"symbol" : "keyword",
"functor" : "keyword",
"tag" : "tag",
"number" : "number",
"string" : "string",
"code" : "number",
"neg-number" : "number",
"pos-number" : "number",
"list_open" : "bracket",
"list_close" : "bracket",
"qq_open" : "bracket",
"qq_sep" : "operator",
"qq_close" : "bracket",
"dict_open" : "bracket",
"dict_close" : "bracket",
"brace_term_open" : "bracket",
"brace_term_close" : "bracket",
"neck" : "keyword",
"fullstop" : "keyword"
};
var builtins = { var builtins = {
"C" : "prolog", "C" : "prolog",
@ -1181,10 +1159,10 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
}; };
/******************************* /*******************************
* RETURN OBJECT * * RETURN OBJECT *
*******************************/ *******************************/
return { var external = {
startState : function() { startState : function() {
return { return {
tokenize : plTokenBase, tokenize : plTokenBase,
@ -1232,30 +1210,32 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
if (builtins[state.curToken] == "prolog") if (builtins[state.curToken] == "prolog")
return "builtin"; return "builtin";
//if (ops[state.curToken]) if (ops[state.curToken])
// return "operator"; return "operator";
//if (typeof(parserConfig.enrich) == "function") //if (typeof(parserConfig.enrich) == "function")
// style = parserConfig.enrich(stream, state, type, content, style); // style = parserConfig.enrich(stream, state, type, content, style);
return style; return style;
}, },
indent : function(state, textAfter) { indent : function(state, textAfter) {
if (state.tokenize == plTokenComment) if (state.tokenize == plTokenComment)
return CodeMirror.Pass; return CodeMirror.Pass;
var nest; var nest;
if ((nest = nesting(state))) { if ((nest = nesting(state))) {
if (nest.closeColumn && !state.commaAtEOL) if (nest.closeColumn && !state.commaAtEOL)
return nest.closeColumn; return nest.closeColumn;
if ( (textAfter === ']' || textAfter === ')') && nest.control)
return nest.alignment-1;
return nest.alignment; return nest.alignment;
} }
if (!state.inBody) if (!state.inBody)
return 0; return 0;
return 4; return conf.indentUnit;
}, },
// theme: "prolog", // theme: "prolog",
@ -1264,7 +1244,9 @@ CodeMirror.defineMode("prolog", function(cm_config, parserConfig) {
blockCommentEnd : "*/", blockCommentEnd : "*/",
blockCommentContinue : " * ", blockCommentContinue : " * ",
lineComment : "%", lineComment : "%",
fold : "indent"
}; };
return external;
}); });

View File

@ -14,7 +14,22 @@ PyObject *YE(term_t t, int line, const char *file, const char *code) {
return NULL; return NULL;
} }
void YEM(const char *exp, int line, const char *file, const char *code) { PyObject *YEC(PyObject *f, PyObject *a, PyObject *d, int line, const char *file, const char *code) {
fprintf(stderr, "**** Warning,%s@%s:%d: failed on Python call \n", code,
file, line);
if (f)
PyObject_Print(f, stderr, 0);
else
fprintf(stderr,"<null>");
if (a)
PyObject_Print(a, stderr, 0);
if (a)
PyObject_Print(a, stderr, 0);
fprintf(stderr,"\n");
return NULL;
}
void YEM(const char *exp, int line, const char *file, const char *code) {
fprintf(stderr, "**** Warning,%s@%s:%d: failed while executing %s\n", code, fprintf(stderr, "**** Warning,%s@%s:%d: failed while executing %s\n", code,
file, line, exp); file, line, exp);
} }
@ -188,7 +203,7 @@ PyObject *term_to_python(term_t t, bool eval, PyObject *o, bool cvt) {
Term t0 = Yap_GetFromHandle(t); Term t0 = Yap_GetFromHandle(t);
Term *tail; Term *tail;
size_t len, i; size_t len, i;
if ((len = Yap_SkipList(&t0, &tail)) >= 0 && *tail == TermNil) { if ((len = Yap_SkipList(&t0, &tail)) > 0 && *tail == TermNil) {
PyObject *out, *a; PyObject *out, *a;
out = PyList_New(len); out = PyList_New(len);
@ -205,10 +220,10 @@ PyObject *term_to_python(term_t t, bool eval, PyObject *o, bool cvt) {
} }
return out; return out;
} else { } else {
PyObject *no = find_obj(o, t, false); PyObject *no = find_term_obj(o, &t0, false);
if (no == o) if (no == o)
return NULL; return NULL;
return term_to_python(t, eval, no, cvt); return yap_to_python(t0, eval, no, cvt);
} }
} else { } else {
{ {

View File

@ -5,7 +5,6 @@
#ifndef PY4YAP_H #ifndef PY4YAP_H
#define PY4YAP_H 1 #define PY4YAP_H 1
#define PASS_REGS #define PASS_REGS
#define USES_REGSg #define USES_REGSg
@ -42,7 +41,7 @@
PyObject *find_obj(PyObject *ob, term_t lhs, bool eval); PyObject *find_obj(PyObject *ob, term_t lhs, bool eval);
#if DEBUG_MEMORY||1 #if DEBUG_MEMORY || 1
#define DebugPrintf(s, op) fprintf(stderr, "%s:%d: " s, __FILE__, __LINE__, op) #define DebugPrintf(s, op) fprintf(stderr, "%s:%d: " s, __FILE__, __LINE__, op)
#else #else
#define DebugPrintf(s, op) #define DebugPrintf(s, op)
@ -63,15 +62,14 @@ extern X_API PyObject *yap_to_python(YAP_Term t, bool eval, PyObject *o,
bool cvt); bool cvt);
extern X_API PyObject *string_to_python(const char *s, bool eval, PyObject *p0); extern X_API PyObject *string_to_python(const char *s, bool eval, PyObject *p0);
typedef YAP_Arity arity_t; typedef YAP_Arity arity_t;
extern bool init_python_vfs(void); extern bool init_python_vfs(void);
extern atom_t ATOM_true, ATOM_false, ATOM_colon, ATOM_dot, ATOM_none, ATOM_t,
extern atom_t ATOM_true, ATOM_false, ATOM_colon, ATOM_dot, ATOM_none, ATOM_t,
ATOM_comma, ATOM_builtin, ATOM_V, ATOM_A, ATOM_self, ATOM_nil, ATOM_comma, ATOM_builtin, ATOM_V, ATOM_A, ATOM_self, ATOM_nil,
ATOM_brackets, ATOM_curly_brackets; ATOM_brackets, ATOM_curly_brackets;
extern functor_t FUNCTOR_dollar1, FUNCTOR_abs1, FUNCTOR_all1, FUNCTOR_any1, FUNCTOR_as2, extern functor_t FUNCTOR_dollar1, FUNCTOR_abs1, FUNCTOR_all1, FUNCTOR_any1,
FUNCTOR_bin1, FUNCTOR_brackets1, FUNCTOR_comma2, FUNCTOR_dir1, FUNCTOR_as2, FUNCTOR_bin1, FUNCTOR_brackets1, FUNCTOR_comma2, FUNCTOR_dir1,
FUNCTOR_float1, FUNCTOR_int1, FUNCTOR_iter1, FUNCTOR_iter2, FUNCTOR_long1, FUNCTOR_float1, FUNCTOR_int1, FUNCTOR_iter1, FUNCTOR_iter2, FUNCTOR_long1,
FUNCTOR_len1, FUNCTOR_curly1, FUNCTOR_ord1, FUNCTOR_range1, FUNCTOR_range2, FUNCTOR_len1, FUNCTOR_curly1, FUNCTOR_ord1, FUNCTOR_range1, FUNCTOR_range2,
FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2, FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2,
@ -147,11 +145,11 @@ static inline PyObject *atom_to_python_string(term_t t) {
} }
} }
#define CHECK_CALL(rc, t, call) \ #define CHECK_CALL(ys, pArgs, pyDict) \
PyErr_Clear(); \ PyErr_Clear(); \
rc = call; \ rc = PyObject_Call(ys, pArgs, pyDict); \
if (rc == NULL || PyErr_Occurred()) { \ if (rc == NULL || PyErr_Occurred()) { \
YE(t, __LINE__, __FILE__, __FUNCTION__); \ YEC(ys, pArgs, pyDict, __LINE__, __FILE__, __FUNCTION__); \
PyErr_Print(); \ PyErr_Print(); \
PyErr_Clear(); \ PyErr_Clear(); \
} }
@ -164,7 +162,8 @@ static inline PyObject *atom_to_python_string(term_t t) {
YEM(#rc, __LINE__, __FILE__, __FUNCTION__); \ YEM(#rc, __LINE__, __FILE__, __FUNCTION__); \
} }
extern PyObject *YE(term_t t, int line, const char *file, const char *code); extern PyObject *YE(term_t , int line, const char *file, const char *code);
extern PyObject *YEC(PyObject *c,PyObject *a ,PyObject *d , int line, const char *file, const char *code);
extern void YEM(const char *ex, int line, const char *file, const char *code); extern void YEM(const char *ex, int line, const char *file, const char *code);
extern void pyErrorHandler__(int line, const char *file, const char *code); extern void pyErrorHandler__(int line, const char *file, const char *code);
@ -209,6 +208,7 @@ X_API extern bool init_python(void);
X_API extern bool loadt_python(void); X_API extern bool loadt_python(void);
X_API extern bool do_init_python(void); X_API extern bool do_init_python(void);
extern PyObject *find_term_obj(PyObject *ob, YAP_Term *yt, bool eval);
extern PyObject PyInit_yap(void); extern PyObject PyInit_yap(void);
extern PyObject *PythonLookup(const char *s, PyObject *o); extern PyObject *PythonLookup(const char *s, PyObject *o);

View File

@ -50,6 +50,11 @@ PyObject *PythonLookupSpecial(const char *s) {
return NULL; return NULL;
} }
static PyObject *builtin(const char *sp) {
PyObject *py_Builtin = PyEval_GetBuiltins();
return PyDict_GetItemString(py_Builtin, sp);
}
PyObject *lookupPySymbol(const char *sp, PyObject *pContext, PyObject **duc) { PyObject *lookupPySymbol(const char *sp, PyObject *pContext, PyObject **duc) {
PyObject *out = NULL; PyObject *out = NULL;
if (!sp) if (!sp)
@ -113,6 +118,22 @@ find_obj(PyObject *ob, term_t l, bool eval) {
return ob; return ob;
} }
PyObject *find_term_obj(PyObject *ob, YAP_Term *yt, bool eval) {
YAP_Term hd;
py_Context = NULL;
// Yap_DebugPlWriteln(yt);
while (YAP_IsPairTerm(*yt)) {
hd = YAP_HeadOfTerm(*yt);
*yt = YAP_TailOfTerm(*yt);
ob = yap_to_python(hd, true, ob, false);
if (!ob) {
return Py_None;
}
}
return ob;
}
/** /**
* Python abs * Python abs
* *
@ -596,7 +617,7 @@ static PyObject *structseq_str(PyObject *iobj) {
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) { for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr; PyObject *val, *repr;
char *crepr; const char *crepr;
val = PyStructSequence_GET_ITEM(obj, i); val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Str(val); repr = PyObject_Str(val);
@ -659,7 +680,7 @@ static PyObject *structseq_repr(PyObject *iobj) {
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) { for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
PyObject *val, *repr; PyObject *val, *repr;
char *crepr; const char *crepr;
val = PyStructSequence_GET_ITEM(obj, i); val = PyStructSequence_GET_ITEM(obj, i);
repr = PyObject_Repr(val); repr = PyObject_Repr(val);
@ -710,18 +731,29 @@ static bool legal_symbol(const char *s) {
} }
PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) { PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
if (legal_symbol(s)) { PyTypeObject *typp;
PyTypeObject *typp; PyObject *key = PyUnicode_FromString(s), *d;
PyObject *key = PyUnicode_FromString(s), *d; if (!legal_symbol(s)) {
if (Py_f2p && (d = PyList_GetItem(Py_f2p, arity)) &&
PyDict_Contains(d, key)) { if (!Py_f2p) {
typp = (PyTypeObject *)PyDict_GetItem(d, key); PyObject *o1;
Py_INCREF(typp); o1 = PyTuple_New(2);
PyTuple_SET_ITEM(o1, 0, PyUnicode_FromString(s));
PyTuple_SET_ITEM(o1, 1, tuple);
return o1;
}
size_t l = 0;
if ((l = PyList_Size(Py_f2p)) < arity) {
for (; l < arity; l++) {
PyList_Append(Py_f2p, PyDict_New());
}
}
if ((d = PyList_GetItem(Py_f2p, arity - 1)) && PyDict_Contains(d, key)) {
typp = (PyTypeObject *)d;
} else { } else {
typp = calloc(sizeof(PyTypeObject), 1); typp = calloc(sizeof(PyTypeObject), 1);
PyStructSequence_Desc *desc = calloc(sizeof(PyStructSequence_Desc), 1); PyStructSequence_Desc *desc = calloc(sizeof(PyStructSequence_Desc), 1);
desc->name = PyMem_Malloc(strlen(s) + 1); desc->name = PyMem_Malloc(strlen(s) + 1);
strcpy(desc->name, s);
desc->doc = "YAPTerm"; desc->doc = "YAPTerm";
desc->fields = pnull; desc->fields = pnull;
desc->n_in_sequence = arity; desc->n_in_sequence = arity;
@ -735,9 +767,7 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
// don't do this: we cannot add a type as an atribute. // don't do this: we cannot add a type as an atribute.
// PyModule_AddGObject(py_Main, s, (PyObject *)typp); // PyModule_AddGObject(py_Main, s, (PyObject *)typp);
if (d && !PyDict_Contains(d, key)) if (d && !PyDict_Contains(d, key))
PyDict_SetItem(d, key, (PyObject *)typp); PyDict_SetItem(d, key, (PyObject*)typp);
Py_INCREF(key);
Py_INCREF(typp);
} }
PyObject *o = PyStructSequence_New(typp); PyObject *o = PyStructSequence_New(typp);
Py_INCREF(typp); Py_INCREF(typp);
@ -751,14 +781,10 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
} }
//((PyStructSequence *)o)->ob_base.ob_size = arity; //((PyStructSequence *)o)->ob_base.ob_size = arity;
// PyObject_Print(o,stderr,0);fputc('\n',stderr); // PyObject_Print(o,stderr,0);fputc('\n',stderr);
Py_INCREF(o);
return o; return o;
} else {
PyObject *o1;
o1 = PyTuple_New(2);
PyTuple_SET_ITEM(o1, 0, PyUnicode_FromString(s));
PyTuple_SET_ITEM(o1, 1, tuple);
return o1;
} }
return NULL;
} }
static PyObject *bip_range(term_t t) { static PyObject *bip_range(term_t t) {
@ -959,11 +985,10 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
if (PySequence_Check(lhs) && PySequence_Check(rhs)) { if (PySequence_Check(lhs) && PySequence_Check(rhs)) {
return PySequence_Concat(lhs, rhs); return PySequence_Concat(lhs, rhs);
} }
if (!PyNumber_Check(lhs)) if (PyNumber_Check(lhs) && PyNumber_Check(rhs))
return NULL; return PyNumber_Add(lhs, rhs);
if (!PyNumber_Check(rhs)) PyObject_Print(builtin("+"), stderr, 0);
return NULL; return PyObject_CallFunctionObjArgs(builtin("+"), lhs, rhs, NULL);
return PyNumber_Add(lhs, rhs);
} else if (fun == FUNCTOR_sub2) { } else if (fun == FUNCTOR_sub2) {
term_t targ = PL_new_term_ref(); term_t targ = PL_new_term_ref();
PyObject *lhs, *rhs; PyObject *lhs, *rhs;
@ -971,19 +996,18 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
if (!PL_get_arg(1, t, targ)) if (!PL_get_arg(1, t, targ))
return NULL; return NULL;
lhs = term_to_python(targ, true, NULL, true); lhs = term_to_python(targ, true, NULL, true);
if (!PyNumber_Check(lhs))
return NULL;
if (!PL_get_arg(2, t, targ)) if (!PL_get_arg(2, t, targ))
return NULL; return NULL;
rhs = term_to_python(targ, true, NULL, true); rhs = term_to_python(targ, true, NULL, true);
if (!PyNumber_Check(rhs)) if (PyNumber_Check(rhs) && PyNumber_Check(lhs))
return NULL; return PyNumber_Subtract(lhs, rhs);
return PyNumber_Subtract(lhs, rhs); return PyObject_CallFunctionObjArgs(builtin("-"), lhs, rhs, NULL);
} else if (fun == FUNCTOR_mul2) { } else if (fun == FUNCTOR_mul2) {
term_t targ = PL_new_term_ref(); term_t targ = PL_new_term_ref();
PyObject *lhs, *rhs; PyObject *lhs, *rhs;
AOK(PL_get_arg(1, t, targ), NULL); AOK(PL_get_arg(1, t, targ), NULL);
/* YAP_DebugPlWriteln(YAP_GetTermSlot(arg)); */
(lhs = term_to_python(targ, true, NULL, true)); (lhs = term_to_python(targ, true, NULL, true));
CHECKNULL(targ, lhs); CHECKNULL(targ, lhs);
AOK(PL_get_arg(2, t, targ), NULL); AOK(PL_get_arg(2, t, targ), NULL);
@ -996,9 +1020,9 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
PyLong_Check(rhs))) { PyLong_Check(rhs))) {
return PySequence_Repeat(lhs, get_p_int(rhs, 0)); return PySequence_Repeat(lhs, get_p_int(rhs, 0));
} }
if (!PyNumber_Check(lhs) + !PyNumber_Check(rhs)) if (PyNumber_Check(lhs) && PyNumber_Check(rhs))
return NULL; return PyNumber_Multiply(lhs, rhs);
return PyNumber_Multiply(lhs, rhs); return PyObject_CallFunctionObjArgs(builtin("*"), lhs, rhs, NULL);
} }
if (!arity) { if (!arity) {
char *s = NULL; char *s = NULL;
@ -1006,7 +1030,6 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
AOK(PL_get_atom_chars(t, &s), NULL); AOK(PL_get_atom_chars(t, &s), NULL);
PyObject_Print(o, stderr, 0); PyObject_Print(o, stderr, 0);
pValue = PyObject_GetAttrString(o, s); pValue = PyObject_GetAttrString(o, s);
PyObject_Print(pValue, stderr, 0);
if (CHECKNULL(t, pValue) == NULL) { if (CHECKNULL(t, pValue) == NULL) {
PyErr_Print(); PyErr_Print();
return NULL; return NULL;
@ -1014,12 +1037,32 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
return pValue; return pValue;
} else { } else {
char *s = PL_atom_chars(name); char *s = PL_atom_chars(name);
if (!strcmp(s,"t")) {
YAP_Term tt = YAP_GetFromSlot(t), tleft;
int i;
PyObject *rc = PyTuple_New(arity);
PyObject *pArg;
for (i=0;i<arity;i++) {
AOK((tleft = YAP_ArgOfTerm(i+1, tt)), NULL);
pArg = yap_to_python(tleft, true, NULL, true);
if (pArg == NULL) {
pArg = Py_None;
}
/* pArg reference stolen here: */
Py_INCREF(pArg);
PyTuple_SetItem(rc, i, pArg);
}
return rc;
}
PyObject *ys = lookupPySymbol(s, o, NULL), *pArgs; PyObject *ys = lookupPySymbol(s, o, NULL), *pArgs;
int i; int i;
term_t tleft = PL_new_term_ref(); term_t tleft = PL_new_term_ref();
bool indict = true; bool indict = true;
PyObject *pyDict = PyDict_New(); PyObject *pyDict = PyDict_New();
pArgs = Py_None;
for (i = arity; i > 0; i--) { for (i = arity; i > 0; i--) {
PyObject *pArg; PyObject *pArg;
AOK(PL_get_arg(i, t, tleft), NULL); AOK(PL_get_arg(i, t, tleft), NULL);
@ -1037,8 +1080,8 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
pArgs = PyTuple_New(i); pArgs = PyTuple_New(i);
} }
} }
fprintf(stderr, "Tuple %p: %s\n", pyDict, // fprintf(stderr, "Tuple %p: %s\n", pyDict,
PyUnicode_AsUTF8(PyObject_Str(pyDict))); // PyUnicode_AsUTF8(PyObject_Str(pyDict)));
if (!indict) { if (!indict) {
if (PL_is_variable(tleft)) { if (PL_is_variable(tleft)) {
pArg = Py_None; pArg = Py_None;
@ -1056,23 +1099,23 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
} }
} }
if (indict) { if (pArgs == Py_None) {
pArgs = PyTuple_New(0); pArgs = PyTuple_New(0);
} }
PyObject *rc; PyObject *rc;
if (ys && PyCallable_Check(ys)) { if (ys && PyCallable_Check(ys)) {
PyObject_Print(ys, stderr, 0); // PyObject_Print(ys, stderr, 0);
PyObject_Print(pArgs, stderr, 0); // PyObject_Print(pArgs, stderr, 0);
PyObject_Print(pyDict, stderr, 0); // PyObject_Print(pyDict, stderr, 0);
// PyObject_Print(pArgs, stderr, 0); // PyObject_Print(pArgs, stderr, 0);
// PyObject_Print(o, stderr, 0); // PyObject_Print(o, stderr, 0);
CHECK_CALL(rc, t, PyObject_Call(ys, pArgs, pyDict)); CHECK_CALL(ys, pArgs, pyDict);
Py_DECREF(pArgs); Py_DECREF(pArgs);
Py_DECREF(ys); Py_DECREF(ys);
PyObject_Print(rc, stderr, 0); // PyObject_Print(rc, stderr, 0);
DebugPrintf("CallObject %p\n", rc); // DebugPrintf("CallObject %p\n", rc);
} else { } else {
rc = term_to_nametuple(s, arity, pArgs); rc = term_to_nametuple(s, arity, pArgs);
} }

View File

@ -127,28 +127,26 @@ static bool py_close(int sno) {
return true; return true;
} }
static bool getLine(StreamDesc *rl_iostream, int sno) {
char *myrl_line = NULL;
// term_t ctk = python_acquire_GIL();
PyObject *readl =
PythonLookup("input", Py_None);
PyObject_Print(readl, stderr, 0);fprintf(stderr," input\n");
static bool pygetLine(StreamDesc *rl_iostream, int sno) {
PyObject *user_inp = PyObject_CallFunction(readl,NULL); // term_t ctk = python_acquire_GIL();
PyObject_Print(user_inp, stderr, 0);fprintf(stderr," input\n"); const char *myrl_line;
myrl_line = PyUnicode_AsUTF8(user_inp); StreamDesc *s = YAP_GetStreamFromId(sno);
//PyObject_Print(myrl_line, stderr, 0);fprintf(stderr," myrl_line\n"); //term_t tg = python_acquire_GIL();
// python_release_GIL(ctk); PyObject *readl = PyObject_GetAttrString(s->u.private_data, "readline");
PyObject *user_inp = PyObject_CallFunction(readl, NULL);
myrl_line = PyUnicode_AsUTF8(user_inp);
if (myrl_line == NULL)
return NULL;
PyObject *err; PyObject *err;
if ((err = PyErr_Occurred())) { if ((err = PyErr_Occurred())) {
if (PyErr_GivenExceptionMatches(err, PyExc_EOFError))
return NULL;
PyErr_SetString(err, "Error in getLine\n"); PyErr_SetString(err, "Error in getLine\n");
Yap_ThrowError(SYSTEM_ERROR_GET_FAILED, YAP_MkIntTerm(sno), err); Yap_ThrowError(SYSTEM_ERROR_GET_FAILED, YAP_MkIntTerm(sno), err);
} }
size_t size = strlen(myrl_line) + 1; rl_iostream->u.irl.ptr = rl_iostream->u.irl.buf = myrl_line;
rl_iostream->u.irl.ptr = rl_iostream->u.irl.buf =
(const unsigned char *)malloc(size);
memmove((void *)rl_iostream->u.irl.buf, myrl_line, size);
return true; return true;
} }
@ -158,16 +156,14 @@ static int py_getc(int sno) {
bool fetch = (s->u.irl.buf == NULL); bool fetch = (s->u.irl.buf == NULL);
if (fetch) { if (fetch) {
if (!getLine(s, sno)) { if (!pygetLine(s, sno)) {
return EOF; return EOF;
} }
} }
const unsigned char *ttyptr = s->u.irl.ptr++, *myrl_line = s->u.irl.buf; const unsigned char *ttyptr = s->u.irl.ptr++;
ch = *ttyptr; ch = *ttyptr;
if (ch == '\0') { if (ch == '\0') {
ch = '\n'; ch = 10;
free((void *)myrl_line);
s->u.irl.ptr = s->u.irl.buf = NULL;
} }
return ch; return ch;
} }
@ -192,7 +188,7 @@ static int py_peek(int sno) {
} }
return ch; return ch;
} }
if (getLine(s, sno)) { if (pygetLine(s, sno)) {
ch = s->u.irl.ptr[0]; ch = s->u.irl.ptr[0];
if (ch == '\0') { if (ch == '\0') {
ch = '\n'; ch = '\n';

View File

@ -7,12 +7,14 @@ PyObject *py_Main;
void pyErrorHandler__(int line, const char *file, const char *code) { void pyErrorHandler__(int line, const char *file, const char *code) {
// this code is called if a Python error is found. // this code is called if a Python error is found.
//int lvl = push_text_stack(); // int lvl = push_text_stack();
PyObject *type, *val; PyObject *type, *val;
// PyErr_Fetch(&type, &val, NULL); // PyErr_Fetch(&type, &val, NULL);
// PyErr_Print(); // PyErr_Print();
// Yap_ThrowError__(file,code,line,0, SYSTEM_ERROR_RUNTIME_PYTHON ,"Python Error %s: %s",PyUnicode_AsUTF8(PyObject_Str(type)), PyUnicode_AsUTF8(PyObject_Str(val))); // Yap_ThrowError__(file,code,line,0, SYSTEM_ERROR_RUNTIME_PYTHON ,"Python
}; // Error %s: %s",PyUnicode_AsUTF8(PyObject_Str(type)),
// PyUnicode_AsUTF8(PyObject_Str(val)));
};
static foreign_t python_len(term_t tobj, term_t tf) { static foreign_t python_len(term_t tobj, term_t tf) {
Py_ssize_t len; Py_ssize_t len;
@ -30,7 +32,6 @@ static foreign_t python_clear_errors(void) {
return true; return true;
} }
static foreign_t python_dir(term_t tobj, term_t tf) { static foreign_t python_dir(term_t tobj, term_t tf) {
PyObject *dir; PyObject *dir;
PyObject *o; PyObject *o;
@ -115,7 +116,9 @@ static foreign_t python_slice(term_t parent, term_t indx, term_t tobj) {
p = term_to_python(parent, true, NULL, true); p = term_to_python(parent, true, NULL, true);
// Exp // Exp
if (!pI || !p) { if (!pI || !p) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} else if ((pF = PySequence_GetSlice(p, 0, 0)) == NULL) { } else if ((pF = PySequence_GetSlice(p, 0, 0)) == NULL) {
PyErr_Print(); PyErr_Print();
{ pyErrorAndReturn(false); } { pyErrorAndReturn(false); }
@ -143,14 +146,18 @@ static foreign_t python_apply(term_t tin, term_t targs, term_t keywds,
pF = term_to_python(tin, true, NULL, true); pF = term_to_python(tin, true, NULL, true);
PyErr_Clear(); PyErr_Clear();
if (pF == NULL) { if (pF == NULL) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
if (PL_is_atom(targs)) { if (PL_is_atom(targs)) {
pArgs = NULL; pArgs = NULL;
} else { } else {
if (!PL_get_name_arity(targs, &aname, &arity)) { if (!PL_get_name_arity(targs, &aname, &arity)) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
if (arity == 1 && PL_get_arg(1, targs, targ) && PL_is_variable(targ)) { if (arity == 1 && PL_get_arg(1, targs, targ) && PL_is_variable(targ)) {
/* ignore (_) */ /* ignore (_) */
@ -277,7 +284,7 @@ static foreign_t python_builtin_eval(term_t caller, term_t dict, term_t out) {
Py_DECREF(pI); Py_DECREF(pI);
if (pOut == NULL) { if (pOut == NULL) {
PyErr_Print(); PyErr_Print();
{ pyErrorAndReturn(false); } { pyErrorAndReturn(false); }
} }
{ {
foreign_t rc = address_to_term(pOut, out); foreign_t rc = address_to_term(pOut, out);
@ -306,10 +313,12 @@ static foreign_t python_access(term_t obj, term_t f, term_t out) {
{ pyErrorAndReturn(false); } { pyErrorAndReturn(false); }
} }
Py_INCREF(pValue); Py_INCREF(pValue);
{ pyErrorAndReturn(python_to_term(pValue, out) ); } { pyErrorAndReturn(python_to_term(pValue, out)); }
} }
if (!PL_get_name_arity(f, &name, &arity)) { if (!PL_get_name_arity(f, &name, &arity)) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
s = PL_atom_chars(name); s = PL_atom_chars(name);
if (!s) { if (!s) {
@ -342,7 +351,9 @@ static foreign_t python_access(term_t obj, term_t f, term_t out) {
Py_DECREF(pArgs); Py_DECREF(pArgs);
Py_DECREF(pF); Py_DECREF(pF);
if (pValue == NULL) { if (pValue == NULL) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
{ pyErrorAndReturn(python_to_term(pValue, out)); } { pyErrorAndReturn(python_to_term(pValue, out)); }
} }
@ -354,7 +365,9 @@ static foreign_t python_field(term_t parent, term_t att, term_t tobj) {
int arity; int arity;
if (!PL_get_name_arity(att, &name, &arity)) { if (!PL_get_name_arity(att, &name, &arity)) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} else { } else {
PyObject *p; PyObject *p;
@ -363,7 +376,9 @@ static foreign_t python_field(term_t parent, term_t att, term_t tobj) {
p = term_to_python(parent, true, NULL, true); p = term_to_python(parent, true, NULL, true);
// Exp // Exp
if (!PL_get_name_arity(att, &name, &arity)) { if (!PL_get_name_arity(att, &name, &arity)) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
s = PL_atom_chars(name); s = PL_atom_chars(name);
if (arity == 1 && !strcmp(s, "()")) { if (arity == 1 && !strcmp(s, "()")) {
@ -371,12 +386,16 @@ static foreign_t python_field(term_t parent, term_t att, term_t tobj) {
pyErrorAndReturn(false); pyErrorAndReturn(false);
} }
if (!PL_get_name_arity(att, &name, &arity)) { if (!PL_get_name_arity(att, &name, &arity)) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} }
s = PL_atom_chars(name); s = PL_atom_chars(name);
} }
if (!s || !p) { if (!s || !p) {
{ pyErrorAndReturn(false); } {
pyErrorAndReturn(false);
}
} else if ((pF = PyObject_GetAttrString(p, s)) == NULL) { } else if ((pF = PyObject_GetAttrString(p, s)) == NULL) {
PyErr_Clear(); PyErr_Clear();
{ pyErrorAndReturn(false); } { pyErrorAndReturn(false); }
@ -548,43 +567,43 @@ static int python_import(term_t mname, term_t mod) {
char s0[MAXPATHLEN], *s = s0; char s0[MAXPATHLEN], *s = s0;
s[0] = '\0'; s[0] = '\0';
const char*sn, *as; const char *sn, *as = NULL;
Term t = Deref(ARG1), sm; Term t = Deref(ARG1), sm;
if (IsApplTerm(t)) { if (IsApplTerm(t)) {
Functor f = FunctorOfTerm(t); Functor f = FunctorOfTerm(t);
if (f != Yap_MkFunctor(Yap_LookupAtom("as"),2)) if (f != FunctorAs)
return false; return false;
do_as = true; do_as = true;
sm = ArgOfTerm(2,t); sm = ArgOfTerm(2, t);
if (IsAtomTerm(sm)) if (IsAtomTerm(sm))
as = RepAtom(AtomOfTerm(sm))->StrOfAE; as = RepAtom(AtomOfTerm(sm))->StrOfAE;
else if (IsStringTerm(sm)) else if (IsStringTerm(sm))
as = StringOfTerm(sm); as = StringOfTerm(sm);
else else
return false; return false;
t = ArgOfTerm(1,t); t = ArgOfTerm(1, t);
} }
while (IsPairTerm(t)) { while (IsPairTerm(t)) {
Term ti = HeadOfTerm(t); Term ti = HeadOfTerm(t);
t = TailOfTerm(t); t = TailOfTerm(t);
if (IsAtomTerm(ti)) if (IsAtomTerm(ti))
sn = RepAtom(AtomOfTerm(ti))->StrOfAE; sn = RepAtom(AtomOfTerm(ti))->StrOfAE;
else if (IsStringTerm(ti)) else if (IsStringTerm(ti))
sn = StringOfTerm(ti); sn = StringOfTerm(ti);
else else
return false; return false;
strcat(s,sn); strcat(s, sn);
strcat(s,"."); strcat(s, ".");
} }
sm = t; sm = t;
if (IsAtomTerm(sm)) if (IsAtomTerm(sm))
sn = RepAtom(AtomOfTerm(sm))->StrOfAE; sn = RepAtom(AtomOfTerm(sm))->StrOfAE;
else if (IsStringTerm(sm)) else if (IsStringTerm(sm))
sn = StringOfTerm(sm); sn = StringOfTerm(sm);
else else
return false; return false;
strcat(s,sn); strcat(s, sn);
term_t t0 = python_acquire_GIL(); term_t t0 = python_acquire_GIL();
#if PY_MAJOR_VERSION < 3 #if PY_MAJOR_VERSION < 3
pName = PyString_FromString(s0); pName = PyString_FromString(s0);
#else #else
@ -599,16 +618,17 @@ static int python_import(term_t mname, term_t mod) {
Py_XDECREF(pName); Py_XDECREF(pName);
if (pModule == NULL) { if (pModule == NULL) {
python_release_GIL(t0); python_release_GIL(t0);
pyErrorAndReturn(false); pyErrorAndReturn(false);
} }
{ {
foreign_t rc = address_to_term(pModule, mod); foreign_t rc = address_to_term(pModule, mod);
if (do_as && PyObject_SetAttrString(py_Main, sn, pModule) <0) if (do_as) {
return false; PyObject_SetAttrString(py_Main, as, pModule);
python_release_GIL(t0); }
python_release_GIL(t0);
pyErrorAndReturn(rc); pyErrorAndReturn(rc);
} }
} }
@ -674,26 +694,25 @@ term_t python_acquire_GIL(void) {
} }
bool python_release_GIL(term_t curBlock) { bool python_release_GIL(term_t curBlock) {
int gstateix; int gstateix;
gstatei--; gstatei--;
PL_get_integer(curBlock, &gstateix); PL_get_integer(curBlock, &gstateix);
PL_reset_term_refs(curBlock); PL_reset_term_refs(curBlock);
if (gstatei != gstateix) { if (gstatei != gstateix) {
if (gstateix > gstatei) { if (gstateix > gstatei) {
fprintf(stderr, "gstateix(%d) > gstatei(%d)\n", gstateix, gstatei); fprintf(stderr, "gstateix(%d) > gstatei(%d)\n", gstateix, gstatei);
return false; return false;
} else { } else {
fprintf(stderr, "gstateix(%d) < gstatei(%d)\n", gstateix, gstatei); fprintf(stderr, "gstateix(%d) < gstatei(%d)\n", gstateix, gstatei);
return false; return false;
}
} }
if (_threaded) { }
if (_threaded) {
PyGILState_Release(gstates[gstatei]); PyGILState_Release(gstates[gstatei]);
} }
pyErrorAndReturn(true); pyErrorAndReturn(true);
} }
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_eval", 3, python_builtin_eval, 0);
PL_register_foreign("python_builtin", 1, python_builtin, 0); PL_register_foreign("python_builtin", 1, python_builtin, 0);

View File

@ -47,8 +47,9 @@ static void add_modules(void) {
if (py_Yapex) if (py_Yapex)
Py_INCREF(py_Yapex); Py_INCREF(py_Yapex);
Py_f2p = PythonLookup("f2p", NULL); Py_f2p = PythonLookup("f2p", NULL);
if (Py_f2p) if (!Py_f2p)
Py_INCREF(Py_f2p); Py_f2p = PyList_New(0);
Py_INCREF(Py_f2p);
init_python_vfs(); init_python_vfs();
} }

View File

@ -117,7 +117,7 @@ Data types are
user:(:=)/1, user:(:=)/1,
% user:(<-)/1, % user:(<-)/1,
% user:(<-)/2, % user:(<-)/2,
user:'()'/1, user:'{}'/1, user:dot_qualified_goal/2, user:import_arg/1. user:'()'/1, user:'{}'/1, user:dot_qualified_goal/1, user:import_arg/1.
import( F ) :- catch( python:python_import(F), _, fail ). import( F ) :- catch( python:python_import(F), _, fail ).

View File

@ -413,11 +413,23 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/kerne
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kernel.js DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/kernel.js
) )
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/meta.js
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/misc/editors/meta.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/
DEPENDS ${CMAKE_SOURCE_DIR}/misc/editors/meta.js
)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/misc/editors/yap.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/misc/editors/yap.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js
DEPENDS ${CMAKE_SOURCE_DIR}/misc/editors/yap.js DEPENDS ${CMAKE_SOURCE_DIR}/misc/editors/yap.js
) )
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/mode.js
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/misc/editors/mode.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/
DEPENDS ${CMAKE_SOURCE_DIR}/misc/editors/mode.js
)
foreach(f ${FILES}) foreach(f ${FILES})
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${f} add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${f}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${f} ${CMAKE_CURRENT_BINARY_DIR}/${f} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${f} ${CMAKE_CURRENT_BINARY_DIR}/${f}
@ -431,7 +443,7 @@ endforeach()
add_custom_target(YAP_KERNEL ALL add_custom_target(YAP_KERNEL ALL
COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} build sdist bdist COMMAND ${PYTHON_EXECUTABLE} ${SETUP_PY} build sdist bdist
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-32x32.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-64x64.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/kernel.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js ${OUTS} YAP4PY DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-32x32.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/logo-64x64.png ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/kernel.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/meta.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/prolog.js ${CMAKE_CURRENT_BINARY_DIR}/yap_kernel/resources/mode.js ${OUTS} YAP4PY
) )

View File

@ -92,9 +92,9 @@ blank(Text) :-
close(user_output), close(user_output),
close(user_error). close(user_error).
streams(true) :- streams(true) :-
open('/python/input', read, Input, [alias(user_input),bom(false),script(false)]), open('/python/sys.stdin', read, _Input, [alias(user_input),bom(false),script(false)]),
open('/python/sys.stdout', append, Output, [alias(user_output)]), open('/python/sys.stdout', append, _Output, [alias(user_output)]),
open('/python/sys.stderr', append, Error, [alias(user_error)]). open('/python/sys.stderr', append, _Error, [alias(user_error)]).
:- if( current_prolog_flag(apple, true) ). :- if( current_prolog_flag(apple, true) ).

View File

@ -514,6 +514,7 @@ class YAPRun:
self.yapeng = JupyterEngine() self.yapeng = JupyterEngine()
global engine global engine
engine = self.yapeng engine = self.yapeng
self.errors = []
self.query = None self.query = None
self.os = None self.os = None
self.it = None self.it = None
@ -577,7 +578,7 @@ class YAPRun:
self.iterations += 1 self.iterations += 1
if self.port == "exit": if self.port == "exit":
self.os = None self.os = None
sys.stderr.write('Done, with'+str(self.answers)+'\n') #sys.stderr.write('Done, with'+str(self.answers)+'\n')
self.result.result = True,self.bindings self.result.result = True,self.bindings
return self.result return self.result
if stop or howmany == self.iterations: if stop or howmany == self.iterations:
@ -658,7 +659,7 @@ class YAPRun:
if store_history: if store_history:
self.result.execution_count = self.shell.execution_count+1 self.result.execution_count = self.shell.execution_count+1
def error_before_exec(value): def error_before_exec(self, value):
self.result.error_before_exec = value self.result.error_before_exec = value
self.shell.last_execution_succeeded = False self.shell.last_execution_succeeded = False
return self.result return self.result
@ -677,10 +678,10 @@ class YAPRun:
# except SyntaxError: # except SyntaxError:
# preprocessing_exc_tuple = self.shell.syntax_error() # sys.exc_info() # preprocessing_exc_tuple = self.shell.syntax_error() # sys.exc_info()
cell = raw_cell # cell has to exist so it can be stored/logged cell = raw_cell # cell has to exist so it can be stored/logged
for i in self.syntaxErrors(raw_cell): for i in self.errors:
try: try:
(what,lin,_,text) = i (_,lin,pos,text) = i
e = SyntaxError(what, ("<string>", lin, 1, text+'\n')) e = SyntaxError(what, (self.cell_name, lin, pos, text+'\n'))
raise e raise e
except SyntaxError: except SyntaxError:
self.shell.showsyntaxerror( ) self.shell.showsyntaxerror( )
@ -696,13 +697,13 @@ class YAPRun:
self.showtraceback(preprocessing_exc_tuple) self.showtraceback(preprocessing_exc_tuple)
if store_history: if store_history:
self.shell.execution_count += 1 self.shell.execution_count += 1
return error_before_exec(preprocessing_exc_tuple[2]) return self.error_before_exec(preprocessing_exc_tuple[2])
# Our own compiler remembers the __future__ environment. If we want to # Our own compiler remembers the __future__ environment. If we want to
# run code with a separate __future__ environment, use the default # run code with a separate __future__ environment, use the default
# compiler # compiler
# compiler = self.shell.compile if shell_futures else CachingCompiler() # compiler = self.shell.compile if shell_futures else CachingCompiler()
cell_name = str( self.shell.execution_count) self.cell_name = str( self.shell.execution_count)
if cell[0] == '%': if cell[0] == '%':
if cell[1] == '%': if cell[1] == '%':
linec = False linec = False
@ -802,7 +803,7 @@ class YAPRun:
its = 0 its = 0
for ch in n: for ch in n:
if not ch.isdigit(): if not ch.isdigit():
raise SyntaxError() raise SyntaxError("expected positive number", (self.cellname,s.strip.lines()+1,s.count('\n'),n))
its = its*10+ (ord(ch) - ord('0')) its = its*10+ (ord(ch) - ord('0'))
stop = False stop = False
else: else:

View File

@ -692,8 +692,8 @@ db_files(Fs) :-
'$csult'(Fs, _M) :- '$csult'(Fs, _M) :-
'$skip_list'(_, Fs ,L), '$skip_list'(_, Fs ,L),
L \== [], L \== [],
user:dot_qualified_goal(Fs), !,
!. user:dot_qualified_goal(Fs).
'$csult'(Fs, M) :- '$csult'(Fs, M) :-
'$extract_minus'(Fs, MFs), !, '$extract_minus'(Fs, MFs), !,
load_files(M:MFs,[]). load_files(M:MFs,[]).
@ -1676,7 +1676,7 @@ prolog_library(File) :-
ensure_loaded(library(File)), ensure_loaded(library(File)),
yap_flag(verbose,_,Old). yap_flag(verbose,_,Old).
:- '$add_multifile'(dot_qualified_goal,2,user). :- '$add_multifile'(dot_qualified_goal,1,user).
/** /**
@} @}

View File

@ -491,8 +491,14 @@ or built-in.
*/ */
predicate_property(Pred,Prop) :- predicate_property(Pred,Prop) :-
current_predicate(_,Pred), (
'$yap_strip_module'(Pred, Mod, TruePred), current_predicate(_,Pred),
'$yap_strip_module'(Pred, Mod, TruePred)
;
'$current_predicate'(_,M,Pred,system),
'$yap_strip_module'(M:Pred, Mod, TruePred)
),
( (
'$pred_exists'(TruePred, Mod) '$pred_exists'(TruePred, Mod)
-> ->