From 1f4a453ec30be66d792d3122c90342296a89b377 Mon Sep 17 00:00:00 2001 From: "Jomi F. Hubner" Date: Fri, 10 Aug 2018 17:41:46 -0300 Subject: [PATCH] add internal action printf --- release-notes.adoc | 13 ++++ src/main/java/jason/asSyntax/ASSyntax.java | 61 +++++++++++++++++-- .../CentralisedRuntimeServices.java | 4 +- src/main/java/jason/stdlib/print.java | 1 + src/main/java/jason/stdlib/printf.java | 59 ++++++++++++++++++ src/main/java/jason/stdlib/println.java | 1 + 6 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 src/main/java/jason/stdlib/printf.java diff --git a/release-notes.adoc b/release-notes.adoc index d65234fb..979ce0e7 100644 --- a/release-notes.adoc +++ b/release-notes.adoc @@ -6,6 +6,19 @@ ifdef::env-github[:outfilesuffix: .adoc] == version 2.3 - new syntax: operator `--` to delete some belief with new focus for the event. +- new internal action: printf, inspired in Java Format + (https://docs.oracle.com/javase/tutorial/java/data/numberformat.html) ++ +---- +I=4; +D=34.123; +.printf("i=%08d and d=%10.2f", I, D); +---- ++ +produces: +---- +i=00000004 and d= 34.12 +---- == version 2.2 (2017-09-21) diff --git a/src/main/java/jason/asSyntax/ASSyntax.java b/src/main/java/jason/asSyntax/ASSyntax.java index 2bcb258b..1e8c6ada 100644 --- a/src/main/java/jason/asSyntax/ASSyntax.java +++ b/src/main/java/jason/asSyntax/ASSyntax.java @@ -1,14 +1,17 @@ package jason.asSyntax; -import jason.asSyntax.parser.ParseException; -import jason.asSyntax.parser.as2j; -import jason.asSyntax.parser.as2jConstants; - import java.io.StringReader; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; +import jason.NoValueException; +import jason.asSyntax.parser.ParseException; +import jason.asSyntax.parser.as2j; +import jason.asSyntax.parser.as2jConstants; + /** Factory for objects used in Jason AgentSpeak syntax. @@ -318,4 +321,54 @@ public static Rule parseRule(String sRule) throws ParseException { throw new ParseException("Expected after "+r+" for parameter '"+sRule+"'"); return r; } + + /** + * Convert a Jason term into a Java Object + * + * @param t Jason term + */ + public static Object termToObject(Term t){ + if (t.isAtom()) { + Atom t2 = (Atom)t; + if (t2.equals(Atom.LTrue)){ + return Boolean.TRUE; + } else if (t2.equals(Atom.LFalse)){ + return Boolean.FALSE; + } else { + return t2.toString(); + } + } else if (t.isNumeric()) { + NumberTerm nt = (NumberTerm)t; + double d = 0; + try { + d = nt.solve(); + } catch (NoValueException e) { + e.printStackTrace(); + } + if (((byte)d)==d){ + return (byte)d; + } else if (((int)d)==d){ + return (int)d; + } else if (((float)d)==d){ + return (float)d; + } else if (((long)d)==d){ + return (long)d; + } else { + return d; + } + } else if (t.isString()) { + return ((StringTerm)t).getString(); //(t.toString()).substring(1,t.toString().length()-1); + } else if (t.isList()) { + List list = new ArrayList<>(); + for (Term t1: (ListTerm)t){ + list.add(termToObject(t1)); + } + return list; + } else if (t instanceof ObjectTerm){ + return ((ObjectTerm)t).getObject(); + } else { + return t.toString(); + } + } + } diff --git a/src/main/java/jason/infra/centralised/CentralisedRuntimeServices.java b/src/main/java/jason/infra/centralised/CentralisedRuntimeServices.java index c06c362a..25c4a7f9 100644 --- a/src/main/java/jason/infra/centralised/CentralisedRuntimeServices.java +++ b/src/main/java/jason/infra/centralised/CentralisedRuntimeServices.java @@ -60,13 +60,13 @@ public String createAgent(String agName, String agSource, String agClass, List @see jason.stdlib.println + @see jason.stdlib.printf */ public class print extends println implements InternalAction { diff --git a/src/main/java/jason/stdlib/printf.java b/src/main/java/jason/stdlib/printf.java new file mode 100644 index 00000000..e5b62977 --- /dev/null +++ b/src/main/java/jason/stdlib/printf.java @@ -0,0 +1,59 @@ +package jason.stdlib; + +import java.util.logging.Level; + +import jason.JasonException; +import jason.asSemantics.InternalAction; +import jason.asSemantics.TransitionSystem; +import jason.asSemantics.Unifier; +import jason.asSyntax.ASSyntax; +import jason.asSyntax.Term; + + +/** +

Internal action: .printf(format, args...). + +

Description: used for printing messages to the console inspired by Java printf/format. + +

Examples:

    +
  • .printf("Value %08d%n",N): prints Value 00461012.
  • +
  • .printf("Value "%10.3f%n"",N): prints Value 3.142.
  • +
+ + @see https://docs.oracle.com/javase/tutorial/java/data/numberformat.html + @see jason.stdlib.print + +*/ +public class printf extends println { + + private static InternalAction singleton = null; + + public static InternalAction create() { + if (singleton == null) + singleton = new printf(); + return singleton; + } + + @Override protected void checkArguments(Term[] args) throws JasonException { + super.checkArguments(args); // check number of arguments + if (!args[0].isString()) + throw JasonException.createWrongArgument(this,"first argument must be a string (the format)"); + } + + @Override + public Object execute(TransitionSystem ts, Unifier un, Term[] args) throws Exception { + Object[] javaArgs = new Object[args.length-1]; + for (int i=1; i