Package abstrasy.externals

Source Code of abstrasy.externals.External_Object

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;
    }

}
TOP

Related Classes of abstrasy.externals.External_Object

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.