Skip to content

Commit

Permalink
add internal action printf
Browse files Browse the repository at this point in the history
  • Loading branch information
jomifred committed Aug 10, 2018
1 parent 0dfff5a commit 1f4a453
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 6 deletions.
13 changes: 13 additions & 0 deletions release-notes.adoc
Expand Up @@ -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)

Expand Down
61 changes: 57 additions & 4 deletions 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.
Expand Down Expand Up @@ -318,4 +321,54 @@ public static Rule parseRule(String sRule) throws ParseException {
throw new ParseException("Expected <EOF> 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<Object> 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();
}
}

}
Expand Up @@ -60,13 +60,13 @@ public String createAgent(String agName, String agSource, String agClass, List<S
agArch.setControlInfraTier(masRunner.getControllerInfraTier());

// if debug mode is active, set up new agent to be synchronous and visible for ExecutionControlGUI
if(BaseCentralisedMAS.debug) {
if (masRunner.isDebug()) {
stts.setVerbose(2);
stts.setSync(true);
agArch.getLogger().setLevel(Level.FINE);
agArch.getTS().getLogger().setLevel(Level.FINE);
agArch.getTS().getAg().getLogger().setLevel(Level.FINE);
}
}

masRunner.addAg(agArch);
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/jason/stdlib/print.java
Expand Up @@ -31,6 +31,7 @@ strings but also any AgentSpeak term (including variables). Terms are made
</ul>
@see jason.stdlib.println
@see jason.stdlib.printf
*/
public class print extends println implements InternalAction {
Expand Down
59 changes: 59 additions & 0 deletions 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;


/**
<p>Internal action: <b><code>.printf(format, args...)</code></b>.
<p>Description: used for printing messages to the console inspired by Java printf/format.
<p>Examples:<ul>
<li> <code>.printf("Value %08d%n",N)</code>: prints <code>Value 00461012</code>.</li>
<li> <code>.printf("Value "%10.3f%n"",N)</code>: prints <code>Value 3.142</code>.</li>
</ul>
@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<args.length; i++) {
javaArgs[i-1] = ASSyntax.termToObject(args[i]);
}
String sout = String.format(args[0].toString(), javaArgs);

if (ts != null && ts.getSettings().logLevel() != Level.WARNING) {
ts.getLogger().info(sout.toString());
} else {
System.out.print(sout.toString() + getNewLine());
}

return true;
}
}
1 change: 1 addition & 0 deletions src/main/java/jason/stdlib/println.java
Expand Up @@ -18,6 +18,7 @@
@see jason.stdlib.print
@see jason.stdlib.printf
*/
public class println extends DefaultInternalAction {
Expand Down

0 comments on commit 1f4a453

Please sign in to comment.