package abstrasy.externals;
import abstrasy.Bivalence;
import abstrasy.Node;
import abstrasy.SELF;
import abstrasy.interpreter.InterpreterException;
import abstrasy.interpreter.StdErrors;
/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
* http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/
public class External_Object extends AExtTools implements AExtClonable {
Node objet = null;
public External_Object() {
}
public Node external_mutator_set(Node startAt) throws Exception {
SELF.require_SELF_mutable();
if (startAt.size() == 1) {
objet = null;
}
else if (startAt.size() == 2) {
objet = startAt.elementAt(1);
}
else {
throw new InterpreterException(StdErrors.Argument_count_mismatch);
}
return null;
}
public Node external_get(Node startAt) throws Exception {
startAt.isGoodArgsLength(true, 1);
return objet;
}
public Node external_is_null(Node startAt) throws Exception {
startAt.isGoodArgsLength(true, 1);
if (objet == null) {
return new Node(Node.TRUE);
}
else {
return new Node(Node.FALSE);
}
}
public Node external_quote(Node startAt) throws Exception {
startAt.isGoodArgsCnt(1, 2);
Node res = null;
if (objet == null) {
res = AExtTools.createNewExpr(Node.createSymbol("Object"));
}
else {
if (startAt.size() == 2) {
// contient un vecteur de références
Node vector = startAt.getSubNode(1, Node.TYPE_CLIST);
if (vector.indexOf(objet) >= 0)
throw new InterpreterException(StdErrors.Circulare_reference);
if (!objet.isNodeType(Node.VTYPE_BY_VALUE))
vector.addElement(objet);
res = AExtTools.createNewExpr(
Node.createSymbol("Object"),
Node.createLazy().append(AExtTools.createSExpression(":set!", new Node[] { objet.toSerialized(vector) }))
);
}
else
res = AExtTools.createNewExpr(
Node.createSymbol("Object"),
Node.createLazy().append(AExtTools.createSExpression(":set!", new Node[] { objet.toSerialized(Node.createCList()) }))
);
}
//Interpreter.Log(res.toString());
return res;
}
public String toString() {
return "objet : " + objet + "\n" +
super.toString();
}
public Object clone_my_self(Bivalence bival) throws Exception {
External_Object t = new External_Object();
t.objet = objet != null ? Node.createClone(this.objet, bival): null;
return t;
}
}