diff options
author | Charles Krinke | 2008-06-07 15:43:16 +0000 |
---|---|---|
committer | Charles Krinke | 2008-06-07 15:43:16 +0000 |
commit | 80079e14e3f92accb309c25778fe87e3916e0143 (patch) | |
tree | 829b5cfd7a69799c35a05ed61d77161d0cdcfdd3 /OpenSim/Region/ScriptEngine | |
parent | *Fixing another object counting bug (diff) | |
download | opensim-SC-80079e14e3f92accb309c25778fe87e3916e0143.zip opensim-SC-80079e14e3f92accb309c25778fe87e3916e0143.tar.gz opensim-SC-80079e14e3f92accb309c25778fe87e3916e0143.tar.bz2 opensim-SC-80079e14e3f92accb309c25778fe87e3916e0143.tar.xz |
Mantis#1475. Thank you kindly, Kinoc for a patch that:
This patch brings the Yield Prolog in sync with the YP r669.
Biggest item is support for functions asserta and assertz ,
providing dynamic databases.
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r-- | OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YP.cs | 270 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YPCompiler.cs | 782 |
2 files changed, 830 insertions, 222 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YP.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YP.cs index a03cd30..68cfd3e 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YP.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YP.cs | |||
@@ -149,6 +149,9 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
149 | YP.getValue(((Functor2)term)._arg2) == Atom.NIL) | 149 | YP.getValue(((Functor2)term)._arg2) == Atom.NIL) |
150 | // Assume it is a char type like "a". | 150 | // Assume it is a char type like "a". |
151 | term = YP.getValue(((Functor2)term)._arg1); | 151 | term = YP.getValue(((Functor2)term)._arg1); |
152 | if (term is Variable) | ||
153 | throw new PrologException(Atom.a("instantiation_error"), | ||
154 | "Expected a number but the argument is an unbound variable"); | ||
152 | 155 | ||
153 | return Convert.ToDouble(term); | 156 | return Convert.ToDouble(term); |
154 | } | 157 | } |
@@ -982,11 +985,22 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
982 | return YP.getValue(Term) is Atom; | 985 | return YP.getValue(Term) is Atom; |
983 | } | 986 | } |
984 | 987 | ||
988 | public static bool integer(object Term) | ||
989 | { | ||
990 | // Debug: Should exhaustively check for all integer types. | ||
991 | return getValue(Term) is int; | ||
992 | } | ||
993 | |||
994 | // Use isFloat instead of float because it is a reserved keyword. | ||
995 | public static bool isFloat(object Term) | ||
996 | { | ||
997 | // Debug: Should exhaustively check for all float types. | ||
998 | return getValue(Term) is double; | ||
999 | } | ||
1000 | |||
985 | public static bool number(object Term) | 1001 | public static bool number(object Term) |
986 | { | 1002 | { |
987 | Term = getValue(Term); | 1003 | return YP.integer(Term) || YP.isFloat(Term); |
988 | // Debug: Should exhaustively check for all number types. | ||
989 | return Term is int || Term is double; | ||
990 | } | 1004 | } |
991 | 1005 | ||
992 | public static bool atomic(object Term) | 1006 | public static bool atomic(object Term) |
@@ -1060,6 +1074,11 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1060 | _outputStream = Console.Out; | 1074 | _outputStream = Console.Out; |
1061 | } | 1075 | } |
1062 | 1076 | ||
1077 | public static IEnumerable<bool> current_output(object Stream) | ||
1078 | { | ||
1079 | return YP.unify(Stream, _outputStream); | ||
1080 | } | ||
1081 | |||
1063 | public static void write(object x) | 1082 | public static void write(object x) |
1064 | { | 1083 | { |
1065 | x = YP.getValue(x); | 1084 | x = YP.getValue(x); |
@@ -1108,6 +1127,93 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1108 | return YP.unify(code, _inputStream.Read()); | 1127 | return YP.unify(code, _inputStream.Read()); |
1109 | } | 1128 | } |
1110 | 1129 | ||
1130 | public static void asserta(object Term, Type declaringClass) | ||
1131 | { | ||
1132 | assertDynamic(Term, declaringClass, true); | ||
1133 | } | ||
1134 | |||
1135 | public static void assertz(object Term, Type declaringClass) | ||
1136 | { | ||
1137 | assertDynamic(Term, declaringClass, false); | ||
1138 | } | ||
1139 | |||
1140 | public static void assertDynamic(object Term, Type declaringClass, bool prepend) | ||
1141 | { | ||
1142 | Term = getValue(Term); | ||
1143 | if (Term is Variable) | ||
1144 | throw new PrologException("instantiation_error", "Term to assert is an unbound variable"); | ||
1145 | |||
1146 | Variable.CopyStore copyStore = new Variable.CopyStore(); | ||
1147 | object TermCopy = makeCopy(Term, copyStore); | ||
1148 | object Head, Body; | ||
1149 | if (TermCopy is Functor2 && ((Functor2)TermCopy)._name == Atom.RULE) | ||
1150 | { | ||
1151 | Head = YP.getValue(((Functor2)TermCopy)._arg1); | ||
1152 | Body = YP.getValue(((Functor2)TermCopy)._arg2); | ||
1153 | } | ||
1154 | else | ||
1155 | { | ||
1156 | Head = TermCopy; | ||
1157 | Body = Atom.a("true"); | ||
1158 | } | ||
1159 | |||
1160 | Atom name = getFunctorName(Head) as Atom; | ||
1161 | if (name == null) | ||
1162 | // name is a non-Atom, such as a number. | ||
1163 | throw new PrologException | ||
1164 | (new Functor2("type_error", Atom.a("callable"), Head), "Term to assert is not callable"); | ||
1165 | object[] args = getFunctorArgs(Head); | ||
1166 | if (!isDynamic(name, args.Length)) | ||
1167 | throw new PrologException | ||
1168 | (new Functor3("permission_error", Atom.a("modify"), Atom.a("static_procedure"), | ||
1169 | new Functor2(Atom.SLASH, name, args.Length)), | ||
1170 | "Assert cannot modify static predicate " + name + "/" + args.Length); | ||
1171 | |||
1172 | if (copyStore.getNUniqueVariables() == 0 && Body == Atom.a("true")) | ||
1173 | { | ||
1174 | // Debug: Until IndexedAnswers supports prepend, compile the fact so we can prepend it below. | ||
1175 | if (!prepend) | ||
1176 | { | ||
1177 | // This is a fact with no unbound variables | ||
1178 | // assertFact uses IndexedAnswers, so don't we don't need to compile. | ||
1179 | assertFact(name, args); | ||
1180 | return; | ||
1181 | } | ||
1182 | } | ||
1183 | |||
1184 | IClause clause = YPCompiler.compileAnonymousClause(Head, Body, declaringClass); | ||
1185 | |||
1186 | // Add the clause to the entry in _predicatesStore. | ||
1187 | NameArity nameArity = new NameArity(name, args.Length); | ||
1188 | List<IClause> clauses; | ||
1189 | if (!_predicatesStore.TryGetValue(nameArity, out clauses)) | ||
1190 | // Create an entry for the nameArity. | ||
1191 | _predicatesStore[nameArity] = (clauses = new List<IClause>()); | ||
1192 | |||
1193 | if (prepend) | ||
1194 | clauses.Insert(0, clause); | ||
1195 | else | ||
1196 | clauses.Add(clause); | ||
1197 | } | ||
1198 | |||
1199 | private static bool isDynamic(Atom name, int arity) | ||
1200 | { | ||
1201 | if (arity == 2 && (name == Atom.a(",") || name == Atom.a(";") || name == Atom.DOT)) | ||
1202 | return false; | ||
1203 | // Use the same mapping to static predicates in YP as the compiler. | ||
1204 | foreach (bool l1 in YPCompiler.functorCallYPFunctionName(name, arity, new Variable())) | ||
1205 | return false; | ||
1206 | // Debug: Do we need to check if name._module is null? | ||
1207 | return true; | ||
1208 | } | ||
1209 | |||
1210 | /// <summary> | ||
1211 | /// Assert values at the end of the set of facts for the predicate with the | ||
1212 | /// name and with arity values.Length. | ||
1213 | /// </summary> | ||
1214 | /// <param name="name">must be an Atom</param> | ||
1215 | /// <param name="values">the array of arguments to the fact predicate. | ||
1216 | /// It is an error if an value has an unbound variable.</param> | ||
1111 | public static void assertFact(Atom name, object[] values) | 1217 | public static void assertFact(Atom name, object[] values) |
1112 | { | 1218 | { |
1113 | NameArity nameArity = new NameArity(name, values.Length); | 1219 | NameArity nameArity = new NameArity(name, values.Length); |
@@ -1130,7 +1236,15 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1130 | indexedAnswers.addAnswer(values); | 1236 | indexedAnswers.addAnswer(values); |
1131 | } | 1237 | } |
1132 | 1238 | ||
1133 | public static IEnumerable<bool> matchFact(Atom name, object[] arguments) | 1239 | /// <summary> |
1240 | /// Match all clauses of the dynamic predicate with the name and with arity | ||
1241 | /// arguments.Length. | ||
1242 | /// It is an error if the predicate is not defined. | ||
1243 | /// </summary> | ||
1244 | /// <param name="name">must be an Atom</param> | ||
1245 | /// <param name="arguments">an array of arity number of arguments</param> | ||
1246 | /// <returns>an iterator which you can use in foreach</returns> | ||
1247 | public static IEnumerable<bool> matchDynamic(Atom name, object[] arguments) | ||
1134 | { | 1248 | { |
1135 | List<IClause> clauses; | 1249 | List<IClause> clauses; |
1136 | if (!_predicatesStore.TryGetValue(new NameArity(name, arguments.Length), out clauses)) | 1250 | if (!_predicatesStore.TryGetValue(new NameArity(name, arguments.Length), out clauses)) |
@@ -1147,20 +1261,46 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1147 | 1261 | ||
1148 | /// <summary> | 1262 | /// <summary> |
1149 | /// Call match(arguments) for each IClause in clauses. We make this a separate | 1263 | /// Call match(arguments) for each IClause in clauses. We make this a separate |
1150 | /// function so that matchFact itself does not need to be an iterator object. | 1264 | /// function so that matchDynamic itself does not need to be an iterator object. |
1151 | /// </summary> | 1265 | /// </summary> |
1152 | /// <param name="clauses"></param> | 1266 | /// <param name="clauses"></param> |
1153 | /// <param name="arguments"></param> | 1267 | /// <param name="arguments"></param> |
1154 | /// <returns></returns> | 1268 | /// <returns></returns> |
1155 | private static IEnumerable<bool> matchAllClauses(List<IClause> clauses, object[] arguments) | 1269 | private static IEnumerable<bool> matchAllClauses(List<IClause> clauses, object[] arguments) |
1156 | { | 1270 | { |
1271 | // Debug: If the clause asserts another clause into this same predicate, the iterator | ||
1272 | // over clauses will be corrupted. Should we take the time to copy clauses? | ||
1157 | foreach (IClause clause in clauses) | 1273 | foreach (IClause clause in clauses) |
1158 | { | 1274 | { |
1159 | foreach (bool lastCall in clause.match(arguments)) | 1275 | foreach (bool lastCall in clause.match(arguments)) |
1276 | { | ||
1160 | yield return false; | 1277 | yield return false; |
1278 | if (lastCall) | ||
1279 | // This happens after a cut in a clause. | ||
1280 | yield break; | ||
1281 | } | ||
1161 | } | 1282 | } |
1162 | } | 1283 | } |
1163 | 1284 | ||
1285 | /// <summary> | ||
1286 | /// This is deprecated and just calls matchDynamic. This matches all clauses, | ||
1287 | /// not just the ones defined with assertFact. | ||
1288 | /// </summary> | ||
1289 | /// <param name="name"></param> | ||
1290 | /// <param name="arguments"></param> | ||
1291 | /// <returns></returns> | ||
1292 | public static IEnumerable<bool> matchFact(Atom name, object[] arguments) | ||
1293 | { | ||
1294 | return matchDynamic(name, arguments); | ||
1295 | } | ||
1296 | |||
1297 | /// <summary> | ||
1298 | /// This actually searches all clauses, not just | ||
1299 | /// the ones defined with assertFact, but we keep the name for | ||
1300 | /// backwards compatibility. | ||
1301 | /// </summary> | ||
1302 | /// <param name="name">must be an Atom</param> | ||
1303 | /// <param name="arguments">an array of arity number of arguments</param> | ||
1164 | public static void retractFact(Atom name, object[] arguments) | 1304 | public static void retractFact(Atom name, object[] arguments) |
1165 | { | 1305 | { |
1166 | NameArity nameArity = new NameArity(name, arguments.Length); | 1306 | NameArity nameArity = new NameArity(name, arguments.Length); |
@@ -1219,40 +1359,18 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1219 | /// <returns></returns> | 1359 | /// <returns></returns> |
1220 | public static IEnumerable<bool> getIterator(object Goal, Type declaringClass) | 1360 | public static IEnumerable<bool> getIterator(object Goal, Type declaringClass) |
1221 | { | 1361 | { |
1362 | Goal = YP.getValue(Goal); | ||
1363 | if (Goal is Variable) | ||
1364 | throw new PrologException("instantiation_error", "Goal to call is an unbound variable"); | ||
1222 | #if true | 1365 | #if true |
1223 | List<Variable> variableSetList = new List<Variable>(); | 1366 | List<Variable> variableSetList = new List<Variable>(); |
1224 | addUniqueVariables(Goal, variableSetList); | 1367 | addUniqueVariables(Goal, variableSetList); |
1225 | Variable[] variableSet = variableSetList.ToArray(); | 1368 | Variable[] variableSet = variableSetList.ToArray(); |
1226 | object Head = Functor.make("function", variableSet); | ||
1227 | 1369 | ||
1228 | object Rule = new Functor2(Atom.RULE, Head, Goal); | 1370 | // Use Atom.F since it is ignored. |
1229 | object RuleList = ListPair.make(new Functor2(Atom.F, Rule, Atom.NIL)); | 1371 | return YPCompiler.compileAnonymousClause |
1230 | StringWriter functionCode = new StringWriter(); | 1372 | (Functor.make(Atom.F, variableSet), Goal, declaringClass).match(variableSet); |
1231 | TextWriter saveOutputStream = _outputStream; | ||
1232 | try | ||
1233 | { | ||
1234 | tell(functionCode); | ||
1235 | Variable FunctionCode = new Variable(); | ||
1236 | foreach (bool l1 in YPCompiler.makeFunctionPseudoCode(RuleList, FunctionCode)) | ||
1237 | { | ||
1238 | if (YP.termEqual(FunctionCode, Atom.a("getDeclaringClass"))) | ||
1239 | // Ignore getDeclaringClass since we have access to the one passed in. | ||
1240 | continue; | ||
1241 | |||
1242 | // Debug: should check if FunctionCode is a single call. | ||
1243 | YPCompiler.convertFunctionCSharp(FunctionCode); | ||
1244 | } | ||
1245 | told(); | ||
1246 | } | ||
1247 | finally | ||
1248 | { | ||
1249 | // Restore after calling tell. | ||
1250 | _outputStream = saveOutputStream; | ||
1251 | } | ||
1252 | return YPCompiler.compileAnonymousFunction | ||
1253 | (functionCode.ToString(), variableSet.Length, declaringClass).match(variableSet); | ||
1254 | #else | 1373 | #else |
1255 | Goal = YP.getValue(Goal); | ||
1256 | Atom name; | 1374 | Atom name; |
1257 | object[] args; | 1375 | object[] args; |
1258 | while (true) | 1376 | while (true) |
@@ -1436,5 +1554,91 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
1436 | throw new NotImplementedException(); | 1554 | throw new NotImplementedException(); |
1437 | } | 1555 | } |
1438 | } | 1556 | } |
1557 | |||
1558 | /// <summary> | ||
1559 | /// An enumerator that wraps another enumerator in order to catch a PrologException. | ||
1560 | /// </summary> | ||
1561 | public class Catch : IEnumerator<bool>, IEnumerable<bool> | ||
1562 | { | ||
1563 | private IEnumerator<bool> _enumerator; | ||
1564 | private PrologException _exception = null; | ||
1565 | |||
1566 | public Catch(IEnumerable<bool> iterator) | ||
1567 | { | ||
1568 | _enumerator = iterator.GetEnumerator(); | ||
1569 | } | ||
1570 | |||
1571 | /// <summary> | ||
1572 | /// Call _enumerator.MoveNext(). If it throws a PrologException, set _exception | ||
1573 | /// and return false. After this returns false, call unifyExceptionOrThrow. | ||
1574 | /// Assume that, after this returns false, it will not be called again. | ||
1575 | /// </summary> | ||
1576 | /// <returns></returns> | ||
1577 | public bool MoveNext() | ||
1578 | { | ||
1579 | try | ||
1580 | { | ||
1581 | return _enumerator.MoveNext(); | ||
1582 | } | ||
1583 | catch (PrologException exception) | ||
1584 | { | ||
1585 | _exception = exception; | ||
1586 | return false; | ||
1587 | } | ||
1588 | } | ||
1589 | |||
1590 | /// <summary> | ||
1591 | /// Call this after MoveNext() returns false to check for an exception. If | ||
1592 | /// MoveNext did not get a PrologException, don't yield. | ||
1593 | /// Otherwise, unify the exception with Catcher and yield so the caller can | ||
1594 | /// do the handler code. However, if can't unify with Catcher then throw the exception. | ||
1595 | /// </summary> | ||
1596 | /// <param name="Catcher"></param> | ||
1597 | /// <returns></returns> | ||
1598 | public IEnumerable<bool> unifyExceptionOrThrow(object Catcher) | ||
1599 | { | ||
1600 | if (_exception != null) | ||
1601 | { | ||
1602 | bool didUnify = false; | ||
1603 | foreach (bool l1 in YP.unify(_exception._term, Catcher)) | ||
1604 | { | ||
1605 | didUnify = true; | ||
1606 | yield return false; | ||
1607 | } | ||
1608 | if (!didUnify) | ||
1609 | throw _exception; | ||
1610 | } | ||
1611 | } | ||
1612 | |||
1613 | public IEnumerator<bool> GetEnumerator() | ||
1614 | { | ||
1615 | return (IEnumerator<bool>)this; | ||
1616 | } | ||
1617 | |||
1618 | IEnumerator IEnumerable.GetEnumerator() | ||
1619 | { | ||
1620 | return GetEnumerator(); | ||
1621 | } | ||
1622 | |||
1623 | public bool Current | ||
1624 | { | ||
1625 | get { return _enumerator.Current; } | ||
1626 | } | ||
1627 | |||
1628 | object IEnumerator.Current | ||
1629 | { | ||
1630 | get { return _enumerator.Current; } | ||
1631 | } | ||
1632 | |||
1633 | public void Dispose() | ||
1634 | { | ||
1635 | _enumerator.Dispose(); | ||
1636 | } | ||
1637 | |||
1638 | public void Reset() | ||
1639 | { | ||
1640 | throw new NotImplementedException(); | ||
1641 | } | ||
1642 | } | ||
1439 | } | 1643 | } |
1440 | } | 1644 | } |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YPCompiler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YPCompiler.cs index d998bac..572583b 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YPCompiler.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/YieldProlog/YPCompiler.cs | |||
@@ -276,6 +276,58 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.YieldProlog | |||
276 | } | 276 | } |
277 | 277 | ||
278 | /// <summary> | 278 | /// <summary> |
279 | /// Use makeFunctionPseudoCode, convertFunctionCSharp and compileAnonymousFunction | ||
280 | /// to return an anonymous YP.IClause for the Head and Body of a rule clause. | ||
281 | /// </summary> | ||
282 | /// <param name="Head">a prolog term such as new Functor2("test1", X, Y). | ||
283 | /// Note that the name of the head is ignored. | ||
284 | /// </param> | ||
285 | /// <param name="Body">a prolog term such as | ||
286 | /// new Functor2(",", new Functor1(Atom.a("test2", Atom.a("")), X), | ||
287 | /// new Functor2("=", Y, X)). | ||
288 | /// This may not be null. (For a head-only clause, set the Body to Atom.a("true"). | ||
289 | /// </param> | ||
290 | /// <param name="declaringClass">if not null, the code is compiled as a subclass of this class | ||
291 | /// to resolve references to the default module Atom.a("")</param> | ||
292 | /// <returns>a new YP.IClause object on which you can call match(object[] args) where | ||
293 | /// args length is the arity of the Head</returns> | ||
294 | public static YP.IClause compileAnonymousClause(object Head, object Body, Type declaringClass) | ||
295 | { | ||
296 | object[] args = YP.getFunctorArgs(Head); | ||
297 | // compileAnonymousFunction wants "function". | ||
298 | object Rule = new Functor2(Atom.RULE, Functor.make("function", args), Body); | ||
299 | object RuleList = ListPair.make(new Functor2(Atom.F, Rule, Atom.NIL)); | ||
300 | |||
301 | StringWriter functionCode = new StringWriter(); | ||
302 | Variable SaveOutputStream = new Variable(); | ||
303 | foreach (bool l1 in YP.current_output(SaveOutputStream)) | ||
304 | { | ||
305 | try | ||
306 | { | ||
307 | YP.tell(functionCode); | ||
308 | Variable FunctionCode = new Variable(); | ||
309 | foreach (bool l2 in makeFunctionPseudoCode(RuleList, FunctionCode)) | ||
310 | { | ||
311 | if (YP.termEqual(FunctionCode, Atom.a("getDeclaringClass"))) | ||
312 | // Ignore getDeclaringClass since we have access to the one passed in. | ||
313 | continue; | ||
314 | |||
315 | // Debug: should check if FunctionCode is a single call. | ||
316 | convertFunctionCSharp(FunctionCode); | ||
317 | } | ||
318 | YP.told(); | ||
319 | } | ||
320 | finally | ||
321 | { | ||
322 | // Restore after calling tell. | ||
323 | YP.tell(SaveOutputStream.getValue()); | ||
324 | } | ||
325 | } | ||
326 | return YPCompiler.compileAnonymousFunction | ||
327 | (functionCode.ToString(), args.Length, declaringClass); | ||
328 | } | ||
329 | |||
330 | /// <summary> | ||
279 | /// Use CodeDomProvider to compile the functionCode and return a YP.IClause. | 331 | /// Use CodeDomProvider to compile the functionCode and return a YP.IClause. |
280 | /// The function name must be "function" and have nArgs arguments. | 332 | /// The function name must be "function" and have nArgs arguments. |
281 | /// </summary> | 333 | /// </summary> |
@@ -337,8 +389,8 @@ namespace Temporary { | |||
337 | 389 | ||
338 | // Compiler output follows. | 390 | // Compiler output follows. |
339 | 391 | ||
340 | class YPInnerClass { } | 392 | public class YPInnerClass { } |
341 | static Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; } | 393 | public static System.Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; } |
342 | 394 | ||
343 | public static void repeatWrite(object arg1, object N) | 395 | public static void repeatWrite(object arg1, object N) |
344 | { | 396 | { |
@@ -391,7 +443,11 @@ namespace Temporary { | |||
391 | CompilerState.assertPred(State, new Functor1(@"var", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 443 | CompilerState.assertPred(State, new Functor1(@"var", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
392 | CompilerState.assertPred(State, new Functor1(@"nonvar", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 444 | CompilerState.assertPred(State, new Functor1(@"nonvar", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
393 | CompilerState.assertPred(State, new Functor1(@"atom", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 445 | CompilerState.assertPred(State, new Functor1(@"atom", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
446 | CompilerState.assertPred(State, new Functor1(@"integer", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | ||
447 | CompilerState.assertPred(State, new Functor1(@"float", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | ||
394 | CompilerState.assertPred(State, new Functor1(@"number", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 448 | CompilerState.assertPred(State, new Functor1(@"number", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
449 | CompilerState.assertPred(State, new Functor1(@"atomic", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | ||
450 | CompilerState.assertPred(State, new Functor1(@"compound", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | ||
395 | CompilerState.assertPred(State, new Functor2(@"==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 451 | CompilerState.assertPred(State, new Functor2(@"==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
396 | CompilerState.assertPred(State, new Functor2(@"\==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 452 | CompilerState.assertPred(State, new Functor2(@"\==", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
397 | CompilerState.assertPred(State, new Functor2(@"@<", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); | 453 | CompilerState.assertPred(State, new Functor2(@"@<", new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in")), new Functor2(@"::", Atom.a(@"univ"), Atom.a(@"in"))), Atom.a(@"semidet")); |
@@ -654,13 +710,37 @@ namespace Temporary { | |||
654 | } | 710 | } |
655 | goto cutIf7; | 711 | goto cutIf7; |
656 | } | 712 | } |
657 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | 713 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) |
714 | { | ||
715 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
716 | { | ||
717 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
718 | { | ||
719 | yield return false; | ||
720 | } | ||
721 | } | ||
722 | goto cutIf8; | ||
723 | } | ||
724 | if (CompilerState.codeUsesYield(State)) | ||
725 | { | ||
726 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
727 | { | ||
728 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
729 | { | ||
730 | yield return false; | ||
731 | } | ||
732 | } | ||
733 | goto cutIf9; | ||
734 | } | ||
735 | foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
658 | { | 736 | { |
659 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 737 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
660 | { | 738 | { |
661 | yield return false; | 739 | yield return false; |
662 | } | 740 | } |
663 | } | 741 | } |
742 | cutIf9: | ||
743 | cutIf8: | ||
664 | cutIf7: | 744 | cutIf7: |
665 | { } | 745 | { } |
666 | } | 746 | } |
@@ -679,19 +759,43 @@ namespace Temporary { | |||
679 | yield return false; | 759 | yield return false; |
680 | } | 760 | } |
681 | } | 761 | } |
682 | goto cutIf9; | 762 | goto cutIf11; |
683 | } | 763 | } |
684 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | 764 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) |
765 | { | ||
766 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
767 | { | ||
768 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
769 | { | ||
770 | yield return false; | ||
771 | } | ||
772 | } | ||
773 | goto cutIf12; | ||
774 | } | ||
775 | if (CompilerState.codeUsesYield(State)) | ||
776 | { | ||
777 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
778 | { | ||
779 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
780 | { | ||
781 | yield return false; | ||
782 | } | ||
783 | } | ||
784 | goto cutIf13; | ||
785 | } | ||
786 | foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
685 | { | 787 | { |
686 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 788 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
687 | { | 789 | { |
688 | yield return false; | 790 | yield return false; |
689 | } | 791 | } |
690 | } | 792 | } |
691 | cutIf9: | 793 | cutIf13: |
794 | cutIf12: | ||
795 | cutIf11: | ||
692 | { } | 796 | { } |
693 | } | 797 | } |
694 | goto cutIf8; | 798 | goto cutIf10; |
695 | } | 799 | } |
696 | foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable<bool>"))) | 800 | foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable<bool>"))) |
697 | { | 801 | { |
@@ -704,19 +808,43 @@ namespace Temporary { | |||
704 | yield return false; | 808 | yield return false; |
705 | } | 809 | } |
706 | } | 810 | } |
707 | goto cutIf10; | 811 | goto cutIf14; |
708 | } | 812 | } |
709 | foreach (bool l11 in YP.unify(BodyWithReturn, BodyCode)) | 813 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) |
814 | { | ||
815 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | ||
816 | { | ||
817 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
818 | { | ||
819 | yield return false; | ||
820 | } | ||
821 | } | ||
822 | goto cutIf15; | ||
823 | } | ||
824 | if (CompilerState.codeUsesYield(State)) | ||
825 | { | ||
826 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | ||
827 | { | ||
828 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
829 | { | ||
830 | yield return false; | ||
831 | } | ||
832 | } | ||
833 | goto cutIf16; | ||
834 | } | ||
835 | foreach (bool l11 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
710 | { | 836 | { |
711 | foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 837 | foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
712 | { | 838 | { |
713 | yield return false; | 839 | yield return false; |
714 | } | 840 | } |
715 | } | 841 | } |
716 | cutIf10: | 842 | cutIf16: |
843 | cutIf15: | ||
844 | cutIf14: | ||
717 | { } | 845 | { } |
718 | } | 846 | } |
719 | cutIf8: | 847 | cutIf10: |
720 | cutIf6: | 848 | cutIf6: |
721 | { } | 849 | { } |
722 | } | 850 | } |
@@ -730,36 +858,36 @@ namespace Temporary { | |||
730 | foreach (bool l3 in YP.unify(Head, FirstRule)) | 858 | foreach (bool l3 in YP.unify(Head, FirstRule)) |
731 | { | 859 | { |
732 | CompilerState.startFunction(State, Head); | 860 | CompilerState.startFunction(State, Head); |
733 | FindallAnswers findallAnswers11 = new FindallAnswers(new Functor2(@"f", ArgAssignments, Calls)); | 861 | FindallAnswers findallAnswers17 = new FindallAnswers(new Functor2(@"f", ArgAssignments, Calls)); |
734 | foreach (bool l4 in member(new Functor2(@"f", Rule, VariableNameSuggestions), SamePredicateRuleList)) | 862 | foreach (bool l4 in member(new Functor2(@"f", Rule, VariableNameSuggestions), SamePredicateRuleList)) |
735 | { | 863 | { |
736 | foreach (bool l5 in compileBodyWithHeadBindings(Rule, VariableNameSuggestions, State, ArgAssignments, Calls)) | 864 | foreach (bool l5 in compileBodyWithHeadBindings(Rule, VariableNameSuggestions, State, ArgAssignments, Calls)) |
737 | { | 865 | { |
738 | findallAnswers11.add(); | 866 | findallAnswers17.add(); |
739 | } | 867 | } |
740 | } | 868 | } |
741 | foreach (bool l4 in findallAnswers11.result(ClauseBag)) | 869 | foreach (bool l4 in findallAnswers17.result(ClauseBag)) |
742 | { | 870 | { |
743 | foreach (bool l5 in YP.univ(Head, new ListPair(Name, ArgsList))) | 871 | foreach (bool l5 in YP.univ(Head, new ListPair(Name, ArgsList))) |
744 | { | 872 | { |
745 | foreach (bool l6 in getFunctionArgNames(ArgsList, 1, FunctionArgNames)) | 873 | foreach (bool l6 in getFunctionArgNames(ArgsList, 1, FunctionArgNames)) |
746 | { | 874 | { |
747 | FindallAnswers findallAnswers12 = new FindallAnswers(MergedArgName); | 875 | FindallAnswers findallAnswers18 = new FindallAnswers(MergedArgName); |
748 | foreach (bool l7 in member(ArgName, FunctionArgNames)) | 876 | foreach (bool l7 in member(ArgName, FunctionArgNames)) |
749 | { | 877 | { |
750 | foreach (bool l8 in argAssignedAll(ArgName, ClauseBag, MergedArgName)) | 878 | foreach (bool l8 in argAssignedAll(ArgName, ClauseBag, MergedArgName)) |
751 | { | 879 | { |
752 | findallAnswers12.add(); | 880 | findallAnswers18.add(); |
753 | goto cutIf13; | 881 | goto cutIf19; |
754 | } | 882 | } |
755 | foreach (bool l8 in YP.unify(MergedArgName, ArgName)) | 883 | foreach (bool l8 in YP.unify(MergedArgName, ArgName)) |
756 | { | 884 | { |
757 | findallAnswers12.add(); | 885 | findallAnswers18.add(); |
758 | } | 886 | } |
759 | cutIf13: | 887 | cutIf19: |
760 | { } | 888 | { } |
761 | } | 889 | } |
762 | foreach (bool l7 in findallAnswers12.result(MergedArgNames)) | 890 | foreach (bool l7 in findallAnswers18.result(MergedArgNames)) |
763 | { | 891 | { |
764 | foreach (bool l8 in maplist_arg(MergedArgNames, FunctionArgs)) | 892 | foreach (bool l8 in maplist_arg(MergedArgNames, FunctionArgs)) |
765 | { | 893 | { |
@@ -778,19 +906,43 @@ namespace Temporary { | |||
778 | yield return false; | 906 | yield return false; |
779 | } | 907 | } |
780 | } | 908 | } |
781 | goto cutIf15; | 909 | goto cutIf21; |
782 | } | 910 | } |
783 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | 911 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) |
912 | { | ||
913 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
914 | { | ||
915 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
916 | { | ||
917 | yield return false; | ||
918 | } | ||
919 | } | ||
920 | goto cutIf22; | ||
921 | } | ||
922 | if (CompilerState.codeUsesYield(State)) | ||
923 | { | ||
924 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
925 | { | ||
926 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
927 | { | ||
928 | yield return false; | ||
929 | } | ||
930 | } | ||
931 | goto cutIf23; | ||
932 | } | ||
933 | foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
784 | { | 934 | { |
785 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 935 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
786 | { | 936 | { |
787 | yield return false; | 937 | yield return false; |
788 | } | 938 | } |
789 | } | 939 | } |
790 | cutIf15: | 940 | cutIf23: |
941 | cutIf22: | ||
942 | cutIf21: | ||
791 | { } | 943 | { } |
792 | } | 944 | } |
793 | goto cutIf14; | 945 | goto cutIf20; |
794 | } | 946 | } |
795 | if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) | 947 | if (CompilerState.determinismEquals(State, Atom.a(@"semidetNoneOut"))) |
796 | { | 948 | { |
@@ -805,19 +957,43 @@ namespace Temporary { | |||
805 | yield return false; | 957 | yield return false; |
806 | } | 958 | } |
807 | } | 959 | } |
808 | goto cutIf17; | 960 | goto cutIf25; |
809 | } | 961 | } |
810 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | 962 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) |
963 | { | ||
964 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
965 | { | ||
966 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
967 | { | ||
968 | yield return false; | ||
969 | } | ||
970 | } | ||
971 | goto cutIf26; | ||
972 | } | ||
973 | if (CompilerState.codeUsesYield(State)) | ||
974 | { | ||
975 | foreach (bool l13 in YP.unify(BodyWithReturn, BodyCode)) | ||
976 | { | ||
977 | foreach (bool l14 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
978 | { | ||
979 | yield return false; | ||
980 | } | ||
981 | } | ||
982 | goto cutIf27; | ||
983 | } | ||
984 | foreach (bool l12 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
811 | { | 985 | { |
812 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 986 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
813 | { | 987 | { |
814 | yield return false; | 988 | yield return false; |
815 | } | 989 | } |
816 | } | 990 | } |
817 | cutIf17: | 991 | cutIf27: |
992 | cutIf26: | ||
993 | cutIf25: | ||
818 | { } | 994 | { } |
819 | } | 995 | } |
820 | goto cutIf16; | 996 | goto cutIf24; |
821 | } | 997 | } |
822 | foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable<bool>"))) | 998 | foreach (bool l10 in YP.unify(ReturnType, Atom.a(@"IEnumerable<bool>"))) |
823 | { | 999 | { |
@@ -830,20 +1006,44 @@ namespace Temporary { | |||
830 | yield return false; | 1006 | yield return false; |
831 | } | 1007 | } |
832 | } | 1008 | } |
833 | goto cutIf18; | 1009 | goto cutIf28; |
1010 | } | ||
1011 | if (CompilerState.determinismEquals(State, Atom.a(@"detNoneOut"))) | ||
1012 | { | ||
1013 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | ||
1014 | { | ||
1015 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
1016 | { | ||
1017 | yield return false; | ||
1018 | } | ||
1019 | } | ||
1020 | goto cutIf29; | ||
834 | } | 1021 | } |
835 | foreach (bool l11 in YP.unify(BodyWithReturn, BodyCode)) | 1022 | if (CompilerState.codeUsesYield(State)) |
1023 | { | ||
1024 | foreach (bool l12 in YP.unify(BodyWithReturn, BodyCode)) | ||
1025 | { | ||
1026 | foreach (bool l13 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | ||
1027 | { | ||
1028 | yield return false; | ||
1029 | } | ||
1030 | } | ||
1031 | goto cutIf30; | ||
1032 | } | ||
1033 | foreach (bool l11 in append(BodyCode, new ListPair(new Functor2(@"foreach", new Functor2(@"call", Atom.a(@"YP.fail"), Atom.NIL), new ListPair(Atom.a(@"yieldfalse"), Atom.NIL)), Atom.NIL), BodyWithReturn)) | ||
836 | { | 1034 | { |
837 | foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) | 1035 | foreach (bool l12 in YP.unify(FunctionCode, new Functor(@"function", new object[] { ReturnType, Name, FunctionArgs, BodyWithReturn }))) |
838 | { | 1036 | { |
839 | yield return false; | 1037 | yield return false; |
840 | } | 1038 | } |
841 | } | 1039 | } |
842 | cutIf18: | 1040 | cutIf30: |
1041 | cutIf29: | ||
1042 | cutIf28: | ||
843 | { } | 1043 | { } |
844 | } | 1044 | } |
845 | cutIf16: | 1045 | cutIf24: |
846 | cutIf14: | 1046 | cutIf20: |
847 | { } | 1047 | { } |
848 | } | 1048 | } |
849 | } | 1049 | } |
@@ -1537,11 +1737,12 @@ namespace Temporary { | |||
1537 | } | 1737 | } |
1538 | } | 1738 | } |
1539 | { | 1739 | { |
1540 | object _State = arg2; | 1740 | object State = arg2; |
1541 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"!"))) | 1741 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"!"))) |
1542 | { | 1742 | { |
1543 | foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldtrue"), new ListPair(Atom.a(@"yieldbreak"), Atom.NIL)))) | 1743 | foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldtrue"), new ListPair(Atom.a(@"yieldbreak"), Atom.NIL)))) |
1544 | { | 1744 | { |
1745 | CompilerState.setCodeUsesYield(State); | ||
1545 | yield return true; | 1746 | yield return true; |
1546 | yield break; | 1747 | yield break; |
1547 | } | 1748 | } |
@@ -1588,11 +1789,12 @@ namespace Temporary { | |||
1588 | } | 1789 | } |
1589 | } | 1790 | } |
1590 | { | 1791 | { |
1591 | object _State = arg2; | 1792 | object State = arg2; |
1592 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"true"))) | 1793 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"true"))) |
1593 | { | 1794 | { |
1594 | foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldfalse"), Atom.NIL))) | 1795 | foreach (bool l3 in YP.unify(arg3, new ListPair(Atom.a(@"yieldfalse"), Atom.NIL))) |
1595 | { | 1796 | { |
1797 | CompilerState.setCodeUsesYield(State); | ||
1596 | yield return true; | 1798 | yield return true; |
1597 | yield break; | 1799 | yield break; |
1598 | } | 1800 | } |
@@ -2022,6 +2224,97 @@ namespace Temporary { | |||
2022 | object State = arg2; | 2224 | object State = arg2; |
2023 | Variable A = new Variable(); | 2225 | Variable A = new Variable(); |
2024 | Variable B = new Variable(); | 2226 | Variable B = new Variable(); |
2227 | Variable ATermCode = new Variable(); | ||
2228 | Variable BCode = new Variable(); | ||
2229 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"asserta", A), B))) | ||
2230 | { | ||
2231 | foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"call", Atom.a(@"YP.asserta"), new ListPair(ATermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), BCode))) | ||
2232 | { | ||
2233 | foreach (bool l4 in compileTerm(A, State, ATermCode)) | ||
2234 | { | ||
2235 | foreach (bool l5 in compileRuleBody(B, State, BCode)) | ||
2236 | { | ||
2237 | yield return true; | ||
2238 | yield break; | ||
2239 | } | ||
2240 | } | ||
2241 | } | ||
2242 | } | ||
2243 | } | ||
2244 | { | ||
2245 | object State = arg2; | ||
2246 | Variable A = new Variable(); | ||
2247 | Variable B = new Variable(); | ||
2248 | Variable ATermCode = new Variable(); | ||
2249 | Variable BCode = new Variable(); | ||
2250 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"assertz", A), B))) | ||
2251 | { | ||
2252 | foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor2(@"call", Atom.a(@"YP.assertz"), new ListPair(ATermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), BCode))) | ||
2253 | { | ||
2254 | foreach (bool l4 in compileTerm(A, State, ATermCode)) | ||
2255 | { | ||
2256 | foreach (bool l5 in compileRuleBody(B, State, BCode)) | ||
2257 | { | ||
2258 | yield return true; | ||
2259 | yield break; | ||
2260 | } | ||
2261 | } | ||
2262 | } | ||
2263 | } | ||
2264 | } | ||
2265 | { | ||
2266 | object State = arg2; | ||
2267 | object PseudoCode = arg3; | ||
2268 | Variable A = new Variable(); | ||
2269 | Variable B = new Variable(); | ||
2270 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor1(@"assert", A), B))) | ||
2271 | { | ||
2272 | foreach (bool l3 in compileRuleBody(new Functor2(@",", new Functor1(@"assertz", A), B), State, PseudoCode)) | ||
2273 | { | ||
2274 | yield return true; | ||
2275 | yield break; | ||
2276 | } | ||
2277 | } | ||
2278 | } | ||
2279 | { | ||
2280 | object State = arg2; | ||
2281 | Variable Goal = new Variable(); | ||
2282 | Variable Catcher = new Variable(); | ||
2283 | Variable Handler = new Variable(); | ||
2284 | Variable B = new Variable(); | ||
2285 | Variable CatchGoal = new Variable(); | ||
2286 | Variable GoalTermCode = new Variable(); | ||
2287 | Variable BCode = new Variable(); | ||
2288 | Variable CatcherTermCode = new Variable(); | ||
2289 | Variable HandlerAndBCode = new Variable(); | ||
2290 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", new Functor3(@"catch", Goal, Catcher, Handler), B))) | ||
2291 | { | ||
2292 | foreach (bool l3 in YP.unify(arg3, new ListPair(new Functor3(@"declare", Atom.a(@"YP.Catch"), CatchGoal, new Functor2(@"new", Atom.a(@"YP.Catch"), new ListPair(new Functor2(@"call", Atom.a(@"YP.getIterator"), new ListPair(GoalTermCode, new ListPair(new Functor2(@"call", Atom.a(@"getDeclaringClass"), Atom.NIL), Atom.NIL))), Atom.NIL))), new ListPair(new Functor2(@"foreach", new Functor1(@"var", CatchGoal), BCode), new ListPair(new Functor2(@"foreach", new Functor3(@"callMember", new Functor1(@"var", CatchGoal), Atom.a(@"unifyExceptionOrThrow"), new ListPair(CatcherTermCode, Atom.NIL)), HandlerAndBCode), Atom.NIL))))) | ||
2293 | { | ||
2294 | foreach (bool l4 in CompilerState.gensym(State, Atom.a(@"catchGoal"), CatchGoal)) | ||
2295 | { | ||
2296 | foreach (bool l5 in compileTerm(Goal, State, GoalTermCode)) | ||
2297 | { | ||
2298 | foreach (bool l6 in compileTerm(Catcher, State, CatcherTermCode)) | ||
2299 | { | ||
2300 | foreach (bool l7 in compileRuleBody(B, State, BCode)) | ||
2301 | { | ||
2302 | foreach (bool l8 in compileRuleBody(new Functor2(@",", Handler, B), State, HandlerAndBCode)) | ||
2303 | { | ||
2304 | yield return true; | ||
2305 | yield break; | ||
2306 | } | ||
2307 | } | ||
2308 | } | ||
2309 | } | ||
2310 | } | ||
2311 | } | ||
2312 | } | ||
2313 | } | ||
2314 | { | ||
2315 | object State = arg2; | ||
2316 | Variable A = new Variable(); | ||
2317 | Variable B = new Variable(); | ||
2025 | Variable ACode = new Variable(); | 2318 | Variable ACode = new Variable(); |
2026 | Variable BCode = new Variable(); | 2319 | Variable BCode = new Variable(); |
2027 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) | 2320 | foreach (bool l2 in YP.unify(arg1, new Functor2(@",", A, B))) |
@@ -2254,28 +2547,39 @@ namespace Temporary { | |||
2254 | } | 2547 | } |
2255 | } | 2548 | } |
2256 | 2549 | ||
2257 | public static IEnumerable<bool> compileFunctorCall(object Functor_1, object State, object arg3) | 2550 | public static IEnumerable<bool> compileFunctorCall(object Functor_1, object State, object PseudoCode) |
2258 | { | 2551 | { |
2259 | { | 2552 | { |
2260 | Variable FunctionName = new Variable(); | ||
2261 | Variable CompiledArgs = new Variable(); | ||
2262 | Variable FunctorName = new Variable(); | 2553 | Variable FunctorName = new Variable(); |
2263 | Variable FunctorArgs = new Variable(); | 2554 | Variable FunctorArgs = new Variable(); |
2264 | Variable x7 = new Variable(); | 2555 | Variable x6 = new Variable(); |
2265 | Variable Arity = new Variable(); | 2556 | Variable Arity = new Variable(); |
2266 | foreach (bool l2 in YP.unify(arg3, new Functor2(@"call", FunctionName, CompiledArgs))) | 2557 | Variable CompiledArgs = new Variable(); |
2558 | Variable FunctionName = new Variable(); | ||
2559 | foreach (bool l2 in YP.univ(Functor_1, new ListPair(FunctorName, FunctorArgs))) | ||
2267 | { | 2560 | { |
2268 | foreach (bool l3 in YP.univ(Functor_1, new ListPair(FunctorName, FunctorArgs))) | 2561 | foreach (bool l3 in YP.functor(Functor_1, x6, Arity)) |
2269 | { | 2562 | { |
2270 | foreach (bool l4 in YP.functor(Functor_1, x7, Arity)) | 2563 | foreach (bool l4 in maplist_compileTerm(FunctorArgs, State, CompiledArgs)) |
2271 | { | 2564 | { |
2272 | foreach (bool l5 in functorCallFunctionName(State, FunctorName, Arity, FunctionName)) | 2565 | foreach (bool l5 in functorCallFunctionName(State, FunctorName, Arity, FunctionName)) |
2273 | { | 2566 | { |
2274 | foreach (bool l6 in maplist_compileTerm(FunctorArgs, State, CompiledArgs)) | 2567 | if (YP.termEqual(FunctionName, Atom.NIL)) |
2568 | { | ||
2569 | foreach (bool l7 in YP.unify(PseudoCode, new Functor2(@"call", Atom.a(@"YP.matchDynamic"), new ListPair(new Functor2(@"call", Atom.a(@"Atom.a"), new ListPair(new Functor1(@"object", FunctorName), Atom.NIL)), new ListPair(new Functor1(@"objectArray", CompiledArgs), Atom.NIL))))) | ||
2570 | { | ||
2571 | yield return true; | ||
2572 | yield break; | ||
2573 | } | ||
2574 | goto cutIf1; | ||
2575 | } | ||
2576 | foreach (bool l6 in YP.unify(PseudoCode, new Functor2(@"call", FunctionName, CompiledArgs))) | ||
2275 | { | 2577 | { |
2276 | yield return true; | 2578 | yield return true; |
2277 | yield break; | 2579 | yield break; |
2278 | } | 2580 | } |
2581 | cutIf1: | ||
2582 | { } | ||
2279 | } | 2583 | } |
2280 | } | 2584 | } |
2281 | } | 2585 | } |
@@ -2287,11 +2591,24 @@ namespace Temporary { | |||
2287 | { | 2591 | { |
2288 | { | 2592 | { |
2289 | object x1 = arg1; | 2593 | object x1 = arg1; |
2290 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"="))) | 2594 | object Name = arg2; |
2595 | object Arity = arg3; | ||
2596 | object FunctionName = arg4; | ||
2597 | foreach (bool l2 in functorCallYPFunctionName(Name, Arity, FunctionName)) | ||
2291 | { | 2598 | { |
2292 | foreach (bool l3 in YP.unify(arg3, 2)) | 2599 | yield return true; |
2600 | yield break; | ||
2601 | } | ||
2602 | } | ||
2603 | { | ||
2604 | object State = arg1; | ||
2605 | object Arity = arg3; | ||
2606 | Variable Name = new Variable(); | ||
2607 | foreach (bool l2 in YP.unify(arg2, Name)) | ||
2608 | { | ||
2609 | foreach (bool l3 in YP.unify(arg4, Name)) | ||
2293 | { | 2610 | { |
2294 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.unify"))) | 2611 | if (CompilerState.nameArityHasModule(State, Name, Arity, Atom.a(@""))) |
2295 | { | 2612 | { |
2296 | yield return true; | 2613 | yield return true; |
2297 | yield break; | 2614 | yield break; |
@@ -2300,12 +2617,14 @@ namespace Temporary { | |||
2300 | } | 2617 | } |
2301 | } | 2618 | } |
2302 | { | 2619 | { |
2303 | object x1 = arg1; | 2620 | object _State = arg1; |
2304 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"=.."))) | 2621 | object _Arity = arg3; |
2622 | Variable Name = new Variable(); | ||
2623 | foreach (bool l2 in YP.unify(arg2, Name)) | ||
2305 | { | 2624 | { |
2306 | foreach (bool l3 in YP.unify(arg3, 2)) | 2625 | foreach (bool l3 in YP.unify(arg4, Name)) |
2307 | { | 2626 | { |
2308 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.univ"))) | 2627 | foreach (bool l4 in Atom.module(Name, Atom.a(@""))) |
2309 | { | 2628 | { |
2310 | yield return true; | 2629 | yield return true; |
2311 | yield break; | 2630 | yield break; |
@@ -2314,12 +2633,54 @@ namespace Temporary { | |||
2314 | } | 2633 | } |
2315 | } | 2634 | } |
2316 | { | 2635 | { |
2317 | object x1 = arg1; | 2636 | object _State = arg1; |
2318 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"var"))) | 2637 | object Name = arg2; |
2638 | object Arity = arg3; | ||
2639 | foreach (bool l2 in YP.unify(arg4, Atom.NIL)) | ||
2319 | { | 2640 | { |
2320 | foreach (bool l3 in YP.unify(arg3, 1)) | 2641 | foreach (bool l3 in Atom.module(Name, Atom.NIL)) |
2321 | { | 2642 | { |
2322 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.var"))) | 2643 | yield return true; |
2644 | yield break; | ||
2645 | } | ||
2646 | } | ||
2647 | } | ||
2648 | { | ||
2649 | object _State = arg1; | ||
2650 | object Name = arg2; | ||
2651 | object Arity = arg3; | ||
2652 | object x4 = arg4; | ||
2653 | Variable Module = new Variable(); | ||
2654 | Variable Message = new Variable(); | ||
2655 | foreach (bool l2 in Atom.module(Name, Module)) | ||
2656 | { | ||
2657 | foreach (bool l3 in YP.atom_concat(Atom.a(@"Not supporting calls to external module: "), Module, Message)) | ||
2658 | { | ||
2659 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), new Functor2(@"/", Name, Arity)), Message)); | ||
2660 | yield return true; | ||
2661 | yield break; | ||
2662 | } | ||
2663 | } | ||
2664 | } | ||
2665 | { | ||
2666 | object _State = arg1; | ||
2667 | object Name = arg2; | ||
2668 | object _Arity = arg3; | ||
2669 | object x4 = arg4; | ||
2670 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), Name), Atom.a(@"Term is not callable"))); | ||
2671 | yield return true; | ||
2672 | yield break; | ||
2673 | } | ||
2674 | } | ||
2675 | |||
2676 | public static IEnumerable<bool> functorCallYPFunctionName(object arg1, object arg2, object arg3) | ||
2677 | { | ||
2678 | { | ||
2679 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"="))) | ||
2680 | { | ||
2681 | foreach (bool l3 in YP.unify(arg2, 2)) | ||
2682 | { | ||
2683 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.unify"))) | ||
2323 | { | 2684 | { |
2324 | yield return true; | 2685 | yield return true; |
2325 | yield break; | 2686 | yield break; |
@@ -2328,12 +2689,11 @@ namespace Temporary { | |||
2328 | } | 2689 | } |
2329 | } | 2690 | } |
2330 | { | 2691 | { |
2331 | object x1 = arg1; | 2692 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"=.."))) |
2332 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"nonvar"))) | ||
2333 | { | 2693 | { |
2334 | foreach (bool l3 in YP.unify(arg3, 1)) | 2694 | foreach (bool l3 in YP.unify(arg2, 2)) |
2335 | { | 2695 | { |
2336 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.nonvar"))) | 2696 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.univ"))) |
2337 | { | 2697 | { |
2338 | yield return true; | 2698 | yield return true; |
2339 | yield break; | 2699 | yield break; |
@@ -2342,12 +2702,11 @@ namespace Temporary { | |||
2342 | } | 2702 | } |
2343 | } | 2703 | } |
2344 | { | 2704 | { |
2345 | object x1 = arg1; | 2705 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"var"))) |
2346 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"arg"))) | ||
2347 | { | 2706 | { |
2348 | foreach (bool l3 in YP.unify(arg3, 3)) | 2707 | foreach (bool l3 in YP.unify(arg2, 1)) |
2349 | { | 2708 | { |
2350 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.arg"))) | 2709 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.var"))) |
2351 | { | 2710 | { |
2352 | yield return true; | 2711 | yield return true; |
2353 | yield break; | 2712 | yield break; |
@@ -2356,12 +2715,11 @@ namespace Temporary { | |||
2356 | } | 2715 | } |
2357 | } | 2716 | } |
2358 | { | 2717 | { |
2359 | object x1 = arg1; | 2718 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"nonvar"))) |
2360 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"functor"))) | ||
2361 | { | 2719 | { |
2362 | foreach (bool l3 in YP.unify(arg3, 3)) | 2720 | foreach (bool l3 in YP.unify(arg2, 1)) |
2363 | { | 2721 | { |
2364 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.functor"))) | 2722 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.nonvar"))) |
2365 | { | 2723 | { |
2366 | yield return true; | 2724 | yield return true; |
2367 | yield break; | 2725 | yield break; |
@@ -2370,12 +2728,11 @@ namespace Temporary { | |||
2370 | } | 2728 | } |
2371 | } | 2729 | } |
2372 | { | 2730 | { |
2373 | object x1 = arg1; | 2731 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"arg"))) |
2374 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"repeat"))) | ||
2375 | { | 2732 | { |
2376 | foreach (bool l3 in YP.unify(arg3, 0)) | 2733 | foreach (bool l3 in YP.unify(arg2, 3)) |
2377 | { | 2734 | { |
2378 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.repeat"))) | 2735 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.arg"))) |
2379 | { | 2736 | { |
2380 | yield return true; | 2737 | yield return true; |
2381 | yield break; | 2738 | yield break; |
@@ -2384,12 +2741,11 @@ namespace Temporary { | |||
2384 | } | 2741 | } |
2385 | } | 2742 | } |
2386 | { | 2743 | { |
2387 | object x1 = arg1; | 2744 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"functor"))) |
2388 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"get_code"))) | ||
2389 | { | 2745 | { |
2390 | foreach (bool l3 in YP.unify(arg3, 1)) | 2746 | foreach (bool l3 in YP.unify(arg2, 3)) |
2391 | { | 2747 | { |
2392 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.get_code"))) | 2748 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.functor"))) |
2393 | { | 2749 | { |
2394 | yield return true; | 2750 | yield return true; |
2395 | yield break; | 2751 | yield break; |
@@ -2398,12 +2754,11 @@ namespace Temporary { | |||
2398 | } | 2754 | } |
2399 | } | 2755 | } |
2400 | { | 2756 | { |
2401 | object x1 = arg1; | 2757 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"repeat"))) |
2402 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"current_op"))) | ||
2403 | { | 2758 | { |
2404 | foreach (bool l3 in YP.unify(arg3, 3)) | 2759 | foreach (bool l3 in YP.unify(arg2, 0)) |
2405 | { | 2760 | { |
2406 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.current_op"))) | 2761 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.repeat"))) |
2407 | { | 2762 | { |
2408 | yield return true; | 2763 | yield return true; |
2409 | yield break; | 2764 | yield break; |
@@ -2412,12 +2767,11 @@ namespace Temporary { | |||
2412 | } | 2767 | } |
2413 | } | 2768 | } |
2414 | { | 2769 | { |
2415 | object x1 = arg1; | 2770 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"get_code"))) |
2416 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"atom_length"))) | ||
2417 | { | 2771 | { |
2418 | foreach (bool l3 in YP.unify(arg3, 2)) | 2772 | foreach (bool l3 in YP.unify(arg2, 1)) |
2419 | { | 2773 | { |
2420 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.atom_length"))) | 2774 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.get_code"))) |
2421 | { | 2775 | { |
2422 | yield return true; | 2776 | yield return true; |
2423 | yield break; | 2777 | yield break; |
@@ -2426,12 +2780,11 @@ namespace Temporary { | |||
2426 | } | 2780 | } |
2427 | } | 2781 | } |
2428 | { | 2782 | { |
2429 | object x1 = arg1; | 2783 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"current_op"))) |
2430 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"atom_concat"))) | ||
2431 | { | 2784 | { |
2432 | foreach (bool l3 in YP.unify(arg3, 3)) | 2785 | foreach (bool l3 in YP.unify(arg2, 3)) |
2433 | { | 2786 | { |
2434 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.atom_concat"))) | 2787 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.current_op"))) |
2435 | { | 2788 | { |
2436 | yield return true; | 2789 | yield return true; |
2437 | yield break; | 2790 | yield break; |
@@ -2440,12 +2793,11 @@ namespace Temporary { | |||
2440 | } | 2793 | } |
2441 | } | 2794 | } |
2442 | { | 2795 | { |
2443 | object x1 = arg1; | 2796 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_length"))) |
2444 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"sub_atom"))) | ||
2445 | { | 2797 | { |
2446 | foreach (bool l3 in YP.unify(arg3, 5)) | 2798 | foreach (bool l3 in YP.unify(arg2, 2)) |
2447 | { | 2799 | { |
2448 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.sub_atom"))) | 2800 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_length"))) |
2449 | { | 2801 | { |
2450 | yield return true; | 2802 | yield return true; |
2451 | yield break; | 2803 | yield break; |
@@ -2454,12 +2806,11 @@ namespace Temporary { | |||
2454 | } | 2806 | } |
2455 | } | 2807 | } |
2456 | { | 2808 | { |
2457 | object x1 = arg1; | 2809 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_concat"))) |
2458 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"atom_codes"))) | ||
2459 | { | 2810 | { |
2460 | foreach (bool l3 in YP.unify(arg3, 2)) | 2811 | foreach (bool l3 in YP.unify(arg2, 3)) |
2461 | { | 2812 | { |
2462 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.atom_codes"))) | 2813 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_concat"))) |
2463 | { | 2814 | { |
2464 | yield return true; | 2815 | yield return true; |
2465 | yield break; | 2816 | yield break; |
@@ -2468,12 +2819,11 @@ namespace Temporary { | |||
2468 | } | 2819 | } |
2469 | } | 2820 | } |
2470 | { | 2821 | { |
2471 | object x1 = arg1; | 2822 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"sub_atom"))) |
2472 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"number_codes"))) | ||
2473 | { | 2823 | { |
2474 | foreach (bool l3 in YP.unify(arg3, 2)) | 2824 | foreach (bool l3 in YP.unify(arg2, 5)) |
2475 | { | 2825 | { |
2476 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.number_codes"))) | 2826 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.sub_atom"))) |
2477 | { | 2827 | { |
2478 | yield return true; | 2828 | yield return true; |
2479 | yield break; | 2829 | yield break; |
@@ -2482,12 +2832,11 @@ namespace Temporary { | |||
2482 | } | 2832 | } |
2483 | } | 2833 | } |
2484 | { | 2834 | { |
2485 | object x1 = arg1; | 2835 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom_codes"))) |
2486 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"copy_term"))) | ||
2487 | { | 2836 | { |
2488 | foreach (bool l3 in YP.unify(arg3, 2)) | 2837 | foreach (bool l3 in YP.unify(arg2, 2)) |
2489 | { | 2838 | { |
2490 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.copy_term"))) | 2839 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom_codes"))) |
2491 | { | 2840 | { |
2492 | yield return true; | 2841 | yield return true; |
2493 | yield break; | 2842 | yield break; |
@@ -2496,12 +2845,11 @@ namespace Temporary { | |||
2496 | } | 2845 | } |
2497 | } | 2846 | } |
2498 | { | 2847 | { |
2499 | object x1 = arg1; | 2848 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"number_codes"))) |
2500 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"sort"))) | ||
2501 | { | 2849 | { |
2502 | foreach (bool l3 in YP.unify(arg3, 2)) | 2850 | foreach (bool l3 in YP.unify(arg2, 2)) |
2503 | { | 2851 | { |
2504 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.sort"))) | 2852 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.number_codes"))) |
2505 | { | 2853 | { |
2506 | yield return true; | 2854 | yield return true; |
2507 | yield break; | 2855 | yield break; |
@@ -2510,12 +2858,11 @@ namespace Temporary { | |||
2510 | } | 2858 | } |
2511 | } | 2859 | } |
2512 | { | 2860 | { |
2513 | object x1 = arg1; | 2861 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"copy_term"))) |
2514 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"script_event"))) | ||
2515 | { | 2862 | { |
2516 | foreach (bool l3 in YP.unify(arg3, 2)) | 2863 | foreach (bool l3 in YP.unify(arg2, 2)) |
2517 | { | 2864 | { |
2518 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.script_event"))) | 2865 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.copy_term"))) |
2519 | { | 2866 | { |
2520 | yield return true; | 2867 | yield return true; |
2521 | yield break; | 2868 | yield break; |
@@ -2524,12 +2871,11 @@ namespace Temporary { | |||
2524 | } | 2871 | } |
2525 | } | 2872 | } |
2526 | { | 2873 | { |
2527 | object x1 = arg1; | 2874 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"sort"))) |
2528 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"nl"))) | ||
2529 | { | 2875 | { |
2530 | foreach (bool l3 in YP.unify(arg3, 0)) | 2876 | foreach (bool l3 in YP.unify(arg2, 2)) |
2531 | { | 2877 | { |
2532 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.nl"))) | 2878 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.sort"))) |
2533 | { | 2879 | { |
2534 | yield return true; | 2880 | yield return true; |
2535 | yield break; | 2881 | yield break; |
@@ -2538,12 +2884,14 @@ namespace Temporary { | |||
2538 | } | 2884 | } |
2539 | } | 2885 | } |
2540 | { | 2886 | { |
2541 | object x1 = arg1; | 2887 | // Manually included : script_event for callback to LSL/C# |
2542 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"write"))) | 2888 | |
2889 | //object x1 = arg1; | ||
2890 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"script_event"))) | ||
2543 | { | 2891 | { |
2544 | foreach (bool l3 in YP.unify(arg3, 1)) | 2892 | foreach (bool l3 in YP.unify(arg2, 2)) |
2545 | { | 2893 | { |
2546 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.write"))) | 2894 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.script_event"))) |
2547 | { | 2895 | { |
2548 | yield return true; | 2896 | yield return true; |
2549 | yield break; | 2897 | yield break; |
@@ -2552,12 +2900,11 @@ namespace Temporary { | |||
2552 | } | 2900 | } |
2553 | } | 2901 | } |
2554 | { | 2902 | { |
2555 | object x1 = arg1; | 2903 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"nl"))) |
2556 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"put_code"))) | ||
2557 | { | 2904 | { |
2558 | foreach (bool l3 in YP.unify(arg3, 1)) | 2905 | foreach (bool l3 in YP.unify(arg2, 0)) |
2559 | { | 2906 | { |
2560 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.put_code"))) | 2907 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.nl"))) |
2561 | { | 2908 | { |
2562 | yield return true; | 2909 | yield return true; |
2563 | yield break; | 2910 | yield break; |
@@ -2566,12 +2913,11 @@ namespace Temporary { | |||
2566 | } | 2913 | } |
2567 | } | 2914 | } |
2568 | { | 2915 | { |
2569 | object x1 = arg1; | 2916 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"write"))) |
2570 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"atom"))) | ||
2571 | { | 2917 | { |
2572 | foreach (bool l3 in YP.unify(arg3, 1)) | 2918 | foreach (bool l3 in YP.unify(arg2, 1)) |
2573 | { | 2919 | { |
2574 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.atom"))) | 2920 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.write"))) |
2575 | { | 2921 | { |
2576 | yield return true; | 2922 | yield return true; |
2577 | yield break; | 2923 | yield break; |
@@ -2580,12 +2926,11 @@ namespace Temporary { | |||
2580 | } | 2926 | } |
2581 | } | 2927 | } |
2582 | { | 2928 | { |
2583 | object x1 = arg1; | 2929 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"put_code"))) |
2584 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"number"))) | ||
2585 | { | 2930 | { |
2586 | foreach (bool l3 in YP.unify(arg3, 1)) | 2931 | foreach (bool l3 in YP.unify(arg2, 1)) |
2587 | { | 2932 | { |
2588 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.number"))) | 2933 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.put_code"))) |
2589 | { | 2934 | { |
2590 | yield return true; | 2935 | yield return true; |
2591 | yield break; | 2936 | yield break; |
@@ -2594,13 +2939,25 @@ namespace Temporary { | |||
2594 | } | 2939 | } |
2595 | } | 2940 | } |
2596 | { | 2941 | { |
2597 | object x1 = arg1; | 2942 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"atom"))) |
2598 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"=="))) | ||
2599 | { | 2943 | { |
2600 | foreach (bool l3 in YP.unify(arg3, 2)) | 2944 | foreach (bool l3 in YP.unify(arg2, 1)) |
2601 | { | 2945 | { |
2602 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termEqual"))) | 2946 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atom"))) |
2947 | { | ||
2948 | yield return true; | ||
2949 | yield break; | ||
2950 | } | ||
2951 | } | ||
2952 | } | ||
2953 | } | ||
2954 | { | ||
2955 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"integer"))) | ||
2603 | { | 2956 | { |
2957 | foreach (bool l3 in YP.unify(arg2, 1)) | ||
2958 | { | ||
2959 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.integer"))) | ||
2960 | { | ||
2604 | yield return true; | 2961 | yield return true; |
2605 | yield break; | 2962 | yield break; |
2606 | } | 2963 | } |
@@ -2608,12 +2965,24 @@ namespace Temporary { | |||
2608 | } | 2965 | } |
2609 | } | 2966 | } |
2610 | { | 2967 | { |
2611 | object x1 = arg1; | 2968 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"float"))) |
2612 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"\=="))) | ||
2613 | { | 2969 | { |
2614 | foreach (bool l3 in YP.unify(arg3, 2)) | 2970 | foreach (bool l3 in YP.unify(arg2, 1)) |
2615 | { | 2971 | { |
2616 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termNotEqual"))) | 2972 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.isFloat"))) |
2973 | { | ||
2974 | yield return true; | ||
2975 | yield break; | ||
2976 | } | ||
2977 | } | ||
2978 | } | ||
2979 | } | ||
2980 | { | ||
2981 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"number"))) | ||
2982 | { | ||
2983 | foreach (bool l3 in YP.unify(arg2, 1)) | ||
2984 | { | ||
2985 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.number"))) | ||
2617 | { | 2986 | { |
2618 | yield return true; | 2987 | yield return true; |
2619 | yield break; | 2988 | yield break; |
@@ -2622,12 +2991,11 @@ namespace Temporary { | |||
2622 | } | 2991 | } |
2623 | } | 2992 | } |
2624 | { | 2993 | { |
2625 | object x1 = arg1; | 2994 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"atomic"))) |
2626 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"@<"))) | ||
2627 | { | 2995 | { |
2628 | foreach (bool l3 in YP.unify(arg3, 2)) | 2996 | foreach (bool l3 in YP.unify(arg2, 1)) |
2629 | { | 2997 | { |
2630 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termLessThan"))) | 2998 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.atomic"))) |
2631 | { | 2999 | { |
2632 | yield return true; | 3000 | yield return true; |
2633 | yield break; | 3001 | yield break; |
@@ -2636,12 +3004,11 @@ namespace Temporary { | |||
2636 | } | 3004 | } |
2637 | } | 3005 | } |
2638 | { | 3006 | { |
2639 | object x1 = arg1; | 3007 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"compound"))) |
2640 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"@=<"))) | ||
2641 | { | 3008 | { |
2642 | foreach (bool l3 in YP.unify(arg3, 2)) | 3009 | foreach (bool l3 in YP.unify(arg2, 1)) |
2643 | { | 3010 | { |
2644 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termLessThanOrEqual"))) | 3011 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.compound"))) |
2645 | { | 3012 | { |
2646 | yield return true; | 3013 | yield return true; |
2647 | yield break; | 3014 | yield break; |
@@ -2650,12 +3017,11 @@ namespace Temporary { | |||
2650 | } | 3017 | } |
2651 | } | 3018 | } |
2652 | { | 3019 | { |
2653 | object x1 = arg1; | 3020 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"=="))) |
2654 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"@>"))) | ||
2655 | { | 3021 | { |
2656 | foreach (bool l3 in YP.unify(arg3, 2)) | 3022 | foreach (bool l3 in YP.unify(arg2, 2)) |
2657 | { | 3023 | { |
2658 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termGreaterThan"))) | 3024 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termEqual"))) |
2659 | { | 3025 | { |
2660 | yield return true; | 3026 | yield return true; |
2661 | yield break; | 3027 | yield break; |
@@ -2664,12 +3030,11 @@ namespace Temporary { | |||
2664 | } | 3030 | } |
2665 | } | 3031 | } |
2666 | { | 3032 | { |
2667 | object x1 = arg1; | 3033 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"\=="))) |
2668 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"@>="))) | ||
2669 | { | 3034 | { |
2670 | foreach (bool l3 in YP.unify(arg3, 2)) | 3035 | foreach (bool l3 in YP.unify(arg2, 2)) |
2671 | { | 3036 | { |
2672 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.termGreaterThanOrEqual"))) | 3037 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termNotEqual"))) |
2673 | { | 3038 | { |
2674 | yield return true; | 3039 | yield return true; |
2675 | yield break; | 3040 | yield break; |
@@ -2678,12 +3043,11 @@ namespace Temporary { | |||
2678 | } | 3043 | } |
2679 | } | 3044 | } |
2680 | { | 3045 | { |
2681 | object x1 = arg1; | 3046 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"@<"))) |
2682 | foreach (bool l2 in YP.unify(arg2, Atom.a(@"throw"))) | ||
2683 | { | 3047 | { |
2684 | foreach (bool l3 in YP.unify(arg3, 1)) | 3048 | foreach (bool l3 in YP.unify(arg2, 2)) |
2685 | { | 3049 | { |
2686 | foreach (bool l4 in YP.unify(arg4, Atom.a(@"YP.throwException"))) | 3050 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termLessThan"))) |
2687 | { | 3051 | { |
2688 | yield return true; | 3052 | yield return true; |
2689 | yield break; | 3053 | yield break; |
@@ -2692,14 +3056,11 @@ namespace Temporary { | |||
2692 | } | 3056 | } |
2693 | } | 3057 | } |
2694 | { | 3058 | { |
2695 | object State = arg1; | 3059 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"@=<"))) |
2696 | object Arity = arg3; | ||
2697 | Variable Name = new Variable(); | ||
2698 | foreach (bool l2 in YP.unify(arg2, Name)) | ||
2699 | { | 3060 | { |
2700 | foreach (bool l3 in YP.unify(arg4, Name)) | 3061 | foreach (bool l3 in YP.unify(arg2, 2)) |
2701 | { | 3062 | { |
2702 | if (CompilerState.nameArityHasModule(State, Name, Arity, Atom.a(@""))) | 3063 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termLessThanOrEqual"))) |
2703 | { | 3064 | { |
2704 | yield return true; | 3065 | yield return true; |
2705 | yield break; | 3066 | yield break; |
@@ -2708,14 +3069,11 @@ namespace Temporary { | |||
2708 | } | 3069 | } |
2709 | } | 3070 | } |
2710 | { | 3071 | { |
2711 | object _State = arg1; | 3072 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"@>"))) |
2712 | object _Arity = arg3; | ||
2713 | Variable Name = new Variable(); | ||
2714 | foreach (bool l2 in YP.unify(arg2, Name)) | ||
2715 | { | 3073 | { |
2716 | foreach (bool l3 in YP.unify(arg4, Name)) | 3074 | foreach (bool l3 in YP.unify(arg2, 2)) |
2717 | { | 3075 | { |
2718 | foreach (bool l4 in Atom.module(Name, Atom.a(@""))) | 3076 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termGreaterThan"))) |
2719 | { | 3077 | { |
2720 | yield return true; | 3078 | yield return true; |
2721 | yield break; | 3079 | yield break; |
@@ -2724,31 +3082,25 @@ namespace Temporary { | |||
2724 | } | 3082 | } |
2725 | } | 3083 | } |
2726 | { | 3084 | { |
2727 | object _State = arg1; | 3085 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"@>="))) |
2728 | object Name = arg2; | 3086 | { |
2729 | object Arity = arg3; | 3087 | foreach (bool l3 in YP.unify(arg2, 2)) |
2730 | object x4 = arg4; | 3088 | { |
2731 | foreach (bool l2 in Atom.module(Name, Atom.NIL)) | 3089 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.termGreaterThanOrEqual"))) |
2732 | { | 3090 | { |
2733 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), new Functor2(@"/", Name, Arity)), Atom.a(@"Calls to dynamic predicates not supported"))); | ||
2734 | yield return true; | 3091 | yield return true; |
2735 | yield break; | 3092 | yield break; |
2736 | } | 3093 | } |
2737 | } | 3094 | } |
3095 | } | ||
3096 | } | ||
2738 | { | 3097 | { |
2739 | object _State = arg1; | 3098 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"throw"))) |
2740 | object Name = arg2; | ||
2741 | object Arity = arg3; | ||
2742 | object x4 = arg4; | ||
2743 | Variable Module = new Variable(); | ||
2744 | Variable Message = new Variable(); | ||
2745 | foreach (bool l2 in Atom.module(Name, Module)) | ||
2746 | { | 3099 | { |
2747 | foreach (bool l3 in Atom.module(Name, Atom.NIL)) | 3100 | foreach (bool l3 in YP.unify(arg2, 1)) |
2748 | { | 3101 | { |
2749 | foreach (bool l4 in YP.atom_concat(Atom.a(@"Not supporting calls to external module: "), Module, Message)) | 3102 | foreach (bool l4 in YP.unify(arg3, Atom.a(@"YP.throwException"))) |
2750 | { | 3103 | { |
2751 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"callable"), new Functor2(@"/", Name, Arity)), Message)); | ||
2752 | yield return true; | 3104 | yield return true; |
2753 | yield break; | 3105 | yield break; |
2754 | } | 3106 | } |
@@ -3052,6 +3404,8 @@ namespace Temporary { | |||
3052 | Variable x9 = new Variable(); | 3404 | Variable x9 = new Variable(); |
3053 | Variable X2 = new Variable(); | 3405 | Variable X2 = new Variable(); |
3054 | Variable Arg2 = new Variable(); | 3406 | Variable Arg2 = new Variable(); |
3407 | Variable x12 = new Variable(); | ||
3408 | Variable Arity = new Variable(); | ||
3055 | if (YP.nonvar(Term)) | 3409 | if (YP.nonvar(Term)) |
3056 | { | 3410 | { |
3057 | foreach (bool l3 in YP.univ(Term, new ListPair(Name, TermArgs))) | 3411 | foreach (bool l3 in YP.univ(Term, new ListPair(Name, TermArgs))) |
@@ -3100,8 +3454,11 @@ namespace Temporary { | |||
3100 | goto cutIf3; | 3454 | goto cutIf3; |
3101 | } | 3455 | } |
3102 | } | 3456 | } |
3103 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"evaluable"), Name), Atom.a(@"Not an expression function"))); | 3457 | foreach (bool l5 in YP.functor(Term, x12, Arity)) |
3458 | { | ||
3459 | YP.throwException(new Functor2(@"error", new Functor2(@"type_error", Atom.a(@"evaluable"), new Functor2(@"/", Name, Arity)), Atom.a(@"Not an expression function"))); | ||
3104 | yield return false; | 3460 | yield return false; |
3461 | } | ||
3105 | cutIf3: | 3462 | cutIf3: |
3106 | cutIf2: | 3463 | cutIf2: |
3107 | cutIf1: | 3464 | cutIf1: |
@@ -3402,9 +3759,9 @@ namespace Temporary { | |||
3402 | { | 3759 | { |
3403 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"getDeclaringClass"))) | 3760 | foreach (bool l2 in YP.unify(arg1, Atom.a(@"getDeclaringClass"))) |
3404 | { | 3761 | { |
3405 | YP.write(Atom.a(@"class YPInnerClass {}")); | 3762 | YP.write(Atom.a(@"public class YPInnerClass {}")); |
3406 | YP.nl(); | 3763 | YP.nl(); |
3407 | YP.write(Atom.a(@"static System.Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; }")); | 3764 | YP.write(Atom.a(@"public static System.Type getDeclaringClass() { return typeof(YPInnerClass).DeclaringType; }")); |
3408 | YP.nl(); | 3765 | YP.nl(); |
3409 | YP.nl(); | 3766 | YP.nl(); |
3410 | return; | 3767 | return; |
@@ -3707,6 +4064,20 @@ namespace Temporary { | |||
3707 | } | 4064 | } |
3708 | } | 4065 | } |
3709 | } | 4066 | } |
4067 | { | ||
4068 | Variable Expression = new Variable(); | ||
4069 | Variable RestStatements = new Variable(); | ||
4070 | foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) | ||
4071 | { | ||
4072 | convertIndentationCSharp(Level); | ||
4073 | YP.write(Atom.a(@"throw ")); | ||
4074 | convertExpressionCSharp(Expression); | ||
4075 | YP.write(Atom.a(@";")); | ||
4076 | YP.nl(); | ||
4077 | convertStatementListCSharp(RestStatements, Level); | ||
4078 | return; | ||
4079 | } | ||
4080 | } | ||
3710 | } | 4081 | } |
3711 | 4082 | ||
3712 | public static void convertIndentationCSharp(object Level) | 4083 | public static void convertIndentationCSharp(object Level) |
@@ -4204,6 +4575,21 @@ namespace Temporary { | |||
4204 | } | 4575 | } |
4205 | } | 4576 | } |
4206 | } | 4577 | } |
4578 | { | ||
4579 | object Level = arg2; | ||
4580 | Variable Expression = new Variable(); | ||
4581 | Variable RestStatements = new Variable(); | ||
4582 | foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) | ||
4583 | { | ||
4584 | convertIndentationJavascript(Level); | ||
4585 | YP.write(Atom.a(@"throw ")); | ||
4586 | convertExpressionJavascript(Expression); | ||
4587 | YP.write(Atom.a(@";")); | ||
4588 | YP.nl(); | ||
4589 | convertStatementListJavascript(RestStatements, Level); | ||
4590 | return; | ||
4591 | } | ||
4592 | } | ||
4207 | } | 4593 | } |
4208 | 4594 | ||
4209 | public static void convertIndentationJavascript(object Level) | 4595 | public static void convertIndentationJavascript(object Level) |
@@ -4983,6 +5369,24 @@ namespace Temporary { | |||
4983 | } | 5369 | } |
4984 | } | 5370 | } |
4985 | } | 5371 | } |
5372 | { | ||
5373 | object Level = arg2; | ||
5374 | object HasBreakableBlock = arg3; | ||
5375 | Variable Expression = new Variable(); | ||
5376 | Variable RestStatements = new Variable(); | ||
5377 | foreach (bool l2 in YP.unify(arg1, new ListPair(new Functor1(@"throw", Expression), RestStatements))) | ||
5378 | { | ||
5379 | convertIndentationPython(Level); | ||
5380 | YP.write(Atom.a(@"raise ")); | ||
5381 | convertExpressionPython(Expression); | ||
5382 | YP.nl(); | ||
5383 | foreach (bool l3 in convertStatementListPython(RestStatements, Level, HasBreakableBlock)) | ||
5384 | { | ||
5385 | yield return true; | ||
5386 | yield break; | ||
5387 | } | ||
5388 | } | ||
5389 | } | ||
4986 | } | 5390 | } |
4987 | 5391 | ||
4988 | public static void convertIndentationPython(object Level) | 5392 | public static void convertIndentationPython(object Level) |