Package org.renjin.primitives

Source Code of org.renjin.primitives.Primitives

package org.renjin.primitives;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.renjin.base.internals.AllNamesVisitor;
import org.renjin.eval.Context;
import org.renjin.eval.EvalException;
import org.renjin.graphics.internals.Graphics;
import org.renjin.graphics.internals.Par;
import org.renjin.graphics.internals.Plot;
import org.renjin.graphics.internals.RgbHsv;
import org.renjin.invoke.codegen.WrapperGenerator2;
import org.renjin.methods.Methods;
import org.renjin.primitives.files.Files;
import org.renjin.primitives.io.Cat;
import org.renjin.primitives.io.DebianControlFiles;
import org.renjin.primitives.io.connections.Connections;
import org.renjin.primitives.io.serialization.Serialization;
import org.renjin.primitives.match.Duplicates;
import org.renjin.primitives.match.Match;
import org.renjin.primitives.matrix.Matrices;
import org.renjin.primitives.packaging.Namespaces;
import org.renjin.primitives.packaging.Packages;
import org.renjin.primitives.sequence.RepFunction;
import org.renjin.primitives.sequence.Sequences;
import org.renjin.primitives.special.*;
import org.renjin.primitives.subset.Subsetting;
import org.renjin.primitives.text.Text;
import org.renjin.primitives.time.Time;
import org.renjin.sexp.*;
import org.renjin.stats.internals.CompleteCases;
import org.renjin.stats.internals.Covariance;
import org.renjin.stats.internals.Distributions;
import org.renjin.stats.internals.FFT;
import org.renjin.stats.internals.distributions.Beta;
import org.renjin.stats.internals.distributions.PsiGamma;
import org.renjin.stats.internals.distributions.RNG;
import org.renjin.stats.internals.distributions.Sampling;
import org.renjin.stats.internals.models.Models;
import org.renjin.stats.internals.optimize.Optimizations;
import org.renjin.stats.internals.optimize.Roots;

import java.util.IdentityHashMap;
import java.util.List;
import java.util.Set;

public class Primitives {

  private IdentityHashMap<Symbol, PrimitiveFunction> builtins = new IdentityHashMap<Symbol, PrimitiveFunction>();
  private IdentityHashMap<Symbol, PrimitiveFunction> internals = new IdentityHashMap<Symbol, PrimitiveFunction>();

  // these are loaded on demand
  private IdentityHashMap<Symbol, Entry> builtinEntries = new IdentityHashMap<Symbol, Entry>();
  private IdentityHashMap<Symbol, Entry> internalEntries = new IdentityHashMap<Symbol, Entry>();
 
  private static final Primitives INSTANCE = new Primitives();
 
  public static PrimitiveFunction getBuiltin(String name) {
    return getBuiltin(Symbol.get(name));
  }
 
  public static PrimitiveFunction getBuiltin(Symbol symbol) {
  synchronized (INSTANCE) {
      PrimitiveFunction fn = INSTANCE.builtins.get(symbol);
      if(fn == null) {
        Entry entry = INSTANCE.builtinEntries.get(symbol);
        if(entry != null) {
          fn = createFunction(entry);
          INSTANCE.builtins.put(symbol, fn);
        }
      }
      return fn;
   }
  }
 
  public static PrimitiveFunction getInternal(Symbol symbol) {
  synchronized (INSTANCE) {
      PrimitiveFunction fn = INSTANCE.internals.get(symbol);
      if(fn == null) {
        Entry entry = INSTANCE.internalEntries.get(symbol);
        if(entry != null) {
          fn = createFunction(entry);
          INSTANCE.internals.put(symbol, fn);
        }
      }
      return fn;
  }
  }
 
  public static List<Entry> getEntries() {
    List<Entry> set = Lists.newArrayList();
    set.addAll(INSTANCE.internalEntries.values());
    set.addAll(INSTANCE.builtinEntries.values());
    return set;
  }
 
  public static Set<Symbol> getBuiltinSymbols() {
    return Sets.union(INSTANCE.builtins.keySet(), INSTANCE.builtinEntries.keySet());
  }
 
  private static PrimitiveFunction createFunction(final Entry entry) {
   try {
      return (PrimitiveFunction) Class.forName(WrapperGenerator2.toFullJavaName(entry.name)).newInstance();
    } catch(Exception e) {
      return new BuiltinFunction(entry.name) {

        @Override
        public SEXP apply(Context context, Environment rho,
            FunctionCall call, PairList args) {
          throw new EvalException("Sorry! " + entry.name + " not yet implemented!");
        }
      };
    }
  }
 
  
  public Primitives() {
    add(new IfFunction());
    add(new WhileFunction());
    add(new ForFunction());
    add(new RepeatFunction());
    add(new BreakFunction());
    add(new NextFunction());
    add(new ReturnFunction());

    f("stop", Conditions.class, 11);
    f("warning", Warning.class, 111);

    f("gettext", Text.class, 11);
    f("ngettext", Text.class, 11);
    f("bindtextdomain", Text.class, 11);
    f(".addCondHands", Conditions.class, 111);
    f(".resetCondHands", /*resetCondHands*/ null, 111);
    f(".signalCondition", Conditions.class, 11);
    f(".dfltStop", Conditions.class, 11);
    f(".dfltWarn", /*dfltWarn*/ null, 11);
    f(".addRestart", Conditions.class, 11);
    f(".getRestart", /*getRestart*/ null, 11);
    f(".invokeRestart", /*invokeRestart*/ null, 11);
    f(".addTryHandlers", /*addTryHandlers*/ null, 111);

    f("geterrmessage", Conditions.class, 11);
    f("seterrmessage", Conditions.class, 111);
    f("printDeferredWarnings", Warning.class, 111);
    f("interruptsSuspended", /*interruptsSuspended*/ null, 11);

    addInternal("restart", new RestartFunction());
    add(new ClosureFunction());

    f("as.function.default", Types.class, 11);

    add(new AssignLeftFunction());
    add(new AssignFunction());
   
    add(new ReassignLeftFunction());
    add(new BeginFunction());
    add(new ParenFunction());

    f(".subset", Subsetting.class, 1);
    f(".subset2", Subsetting.class, 1);
    f("[",Subsetting.class, -1);
    f("[[", Subsetting.class, -1);
    f("$", Subsetting.class, 2);
    f("@", Subsetting.class, 2);
    f("[<-", Subsetting.class, 3);
    f("[[<-", Subsetting.class, 3);
    f("$<-", Subsetting.class, 3);

    add(new SwitchFunction());

    f("browser", /*browser*/ null, 101);
    f("debug", /*debug*/ null, 111);
    f("undebug", /*debug*/ null, 111);
    f("isdebugged", /*debug*/ null, 11);
    f("debugonce", /*debug*/ null, 111);
    f(".primTrace", /*trace*/ null, 101);
    f(".primUntrace", /*trace*/ null, 101);

    add(new InternalFunction());
    add(new OnExitFunction());

    addInternal("Recall", new RecallFunction());
    f("delayedAssign", Evaluation.class, 111);
    f("makeLazy", Serialization.class, 111);
    f(".Primitive", Evaluation.class, 1);
    f("identical",  Identical.class, 11);


/* Binary Operators */
/* these are group generic and so need to eval args */
    f("+",  Ops.class,  /* PLUSOP, */  2);
    f("-", Ops.class,   /* MINUSOP, */  2);
    f("*", Ops.class,  /*TIMESOP ,*/  2);
    f("/", Ops.class,  /*DIVOP,*/  2);
    f("^", Ops.class,   /*POWOP,*/  2);
//    add(new OpsFunction("+"));
//    add(new OpsFunction("-"));
//    add(new OpsFunction("*"));
//    add(new OpsFunction("/"));
//    add(new OpsFunction("^"));

    f("%%", Ops.class,  /* MODOP */ 2);
    f("%/%", Ops.class,  /* IDIVOP */ 2);
    f("%*%", Matrices.class, 2);
    f("crossprod", Matrices.class, 11);
    f("tcrossprod", Matrices.class, 11);


/* these are group generic and so need to eval args */
    f("==", Ops.class, 2);
    f("!=", Ops.class, 2);
    f("<", Ops.class, 2);
    f("<=", Ops.class, 2);
    f(">=", Ops.class, 2);
    f(">", Ops.class, 2);
    f("&", Ops.class, 2);
    f("|", Ops.class, 2);
    f("!", Ops.class, 1);
//    add(new OpsFunction("=="));
//    add(new OpsFunction("!="));
//    add(new OpsFunction("<"));
//    add(new OpsFunction("<="));
//    add(new OpsFunction(">"));
//    add(new OpsFunction(">="));
//    add(new OpsFunction("&"));
//    add(new OpsFunction("|"));
//    add(new OpsFunction("!"));

    f("&&", Comparison.class, "and", 0);
    f("||", Comparison.class, "or", 0);
    f(":", Sequences.class, "colon", 1);

    add(new TildeFunction());

/* Logic Related Functions */
/* these are group generic and so need to eval args */
    f("all", Summary.class, 1);
    f("any", Summary.class, 1);


/* Vectors, Matrices and Arrays */

/* printname  c-entry   offset  eval  arity pp-kind      precedence rightassoc
* ---------  -------   ------  ----  ----- -------      ---------- ----------*/
    f("vector", Vectors.class, 11);
    f("complex", ComplexGroup.class, 11);
    f("matrix", Matrices.class, 11);
    f("length", Vectors.class, 1);
    f("length<-", Vectors.class, 2);
    f("row", Matrices.class, 11);
    f("col", Matrices.class, 11);
    f("c", Combine.class, 1);
    f("unlist", Combine.class, 11);
    f("cbind", Combine.class, 10);
    f("rbind", Combine.class, 10);
    f("drop", Vectors.class, 11);
    f("oldClass", Attributes.class, 1);
    f("oldClass<-", Attributes.class, 2);
    f("class", Attributes.class, "getClass", 1);
    f(".cache_class", Methods.class, 2);
    f("class<-", Attributes.class, "setClass", 1);
    f("unclass", Attributes.class, 1);
    f("names", Attributes.class,  "getNames", 1);
    f("names<-", Attributes.class, "setNames", 1);
    f("dimnames", Attributes.class, 1);
    f("dimnames<-", Attributes.class, 2);
    f("all.names", AllNamesVisitor.class, 11);
    f("dim", Attributes.class, 1);
    f("dim<-", Attributes.class, 2);
    f("attributes", Attributes.class, 1);
    f("attributes<-", Attributes.class, null, 1);
    f("attr", Attributes.class, 1);
    f("attr<-", Attributes.class, 3);
    f("comment", Attributes.class, 11);
    f("comment<-", Attributes.class, 2);
    f("levels<-", Attributes.class, 2);
    f("get", Environments.class, 11);
    f("mget", /*mget*/ null, 11);
    f("exists", Environments.class, 11);
    f("assign", Evaluation.class, 111);
    f("remove", Evaluation.class, 111);
    f("duplicated", Duplicates.class, 11);
    f("unique", Duplicates.class, 11);
    f("anyDuplicated", Duplicates.class, 11);
    f("which.min", Sort.class, 11);
    f("which", Match.class, 11);
    f("pmin", Summary.class, 11);
    f("pmax", Summary.class, 11);
    f("which.max", Sort.class, 11);
    f("match", Match.class, 11);
    f("pmatch", Match.class, 11);
    f("charmatch", Match.class, 11);
    f("match.call", Match.class, 11);
    f("complete.cases", CompleteCases.class, 11);

    f("attach", Environments.class, 111);
    f("detach", Environments.class, 111);
    f("search", Environments.class, 11);


/* Mathematical Functions */
/* these are group generic and so need to eval args */
/* Note that the number of arguments for the primitives in the Math group
   only applies to the default method. */
    f("round", MathExt.class, 0);
    f("signif", MathExt.class, 0);
    f("atan",Math.class, 1);
    f("log", MathExt.class, 0);
    f("log10", Math.class, 1);
    f("log2", MathExt.class, 1);
    f("abs", MathExt.class, 1);
    f("floor", Math.class, 1);
    f("ceiling", Math.class, "ceil", 1);
    f("sqrt", Math.class, 1);
    f("sign", MathExt.class, "sign", 1);
    f("trunc", MathExt.class, 1);
   
    f("exp", Math.class, 1);
    f("expm1", MathExt.class, 1);
    f("log1p", MathExt.class, 1);

    f("cos", Math.class, 1);
    f("sin", Math.class, 1);
    f("tan", Math.class, 1);
    f("acos", Math.class, 1);
    f("asin", Math.class, 1);

    f("cosh", Math.class, 1);
    f("sinh", Math.class, 1);
    f("tanh", Math.class, 1);
    f("acosh", MathExt.class, 1);
    f("asinh", MathExt.class, 1);
    f("atanh", MathExt.class, 1);

    f("lgamma", MathExt.class, 1);
    f("gamma", MathExt.class, 1);

    f("digamma", org.apache.commons.math.special.Gamma.class, 1);
    f("trigamma",org.apache.commons.math.special.Gamma.class, 1);
/* see "psigamma" below !*/

/* Mathematical Functions of Two Numeric (+ 1-2 int) Variables */

    f("atan2", MathExt.class, 11);

    f("lbeta", MathExt.class, 11);
    f("beta", MathExt.class, 11);
    f("lchoose", MathExt.class, 11);
    f("choose", MathExt.class, 11);

    f("dchisq", Distributions.class, 11);
    f("pchisq", Distributions.class, 11);
    f("qchisq", Distributions.class, 11);

    f("dexp", Distributions.class, 11);
    f("pexp", Distributions.class, 11);
    f("qexp", Distributions.class, 11);

    f("dgeom", Distributions.class, 11);
    f("pgeom", Distributions.class, 11);
    f("qgeom", Distributions.class, 11);

    f("dpois", Distributions.class, 11);
    f("ppois", Distributions.class, 11);
    f("qpois", null , 11);

    f("dt", Distributions.class, 11);
    f("pt", Distributions.class, 11);
    f("qt", Distributions.class, 11);

    f("dsignrank", Distributions.class, 11);
    f("psignrank", Distributions.class, 11);
    f("qsignrank", Distributions.class, 11);

    f("besselJ", /*math2*/ null, 11);
    f("besselY", /*math2*/ null, 11);

    f("psigamma", PsiGamma.class, 11);


/* Mathematical Functions of a Complex Argument */
/* these are group generic and so need to eval args */

    f("Re", ComplexGroup.class, 1);
    f("Im", ComplexGroup.class, 1);
    f("Mod", ComplexGroup.class, 1);
    f("Arg", ComplexGroup.class, 1);
    f("Conj", ComplexGroup.class, 1);


/* Mathematical Functions of Three Numeric (+ 1-2 int) Variables */

    f("dbeta", Distributions.class, 11);
    f("pbeta", Distributions.class, 11);
    f("qbeta", Distributions.class, 11);

    f("dbinom", Distributions.class, 11);
    f("pbinom", Distributions.class, 11);
    f("qbinom", Distributions.class, 11);

    f("dcauchy", Distributions.class, 11);
    f("pcauchy", Distributions.class, 11);
    f("qcauchy", Distributions.class, 11);

    f("df", Distributions.class, 11);
    f("pf", Distributions.class, 11);
    f("qf", Distributions.class, 11);

    f("dgamma", Distributions.class, 11);
    f("pgamma", Distributions.class, 11);
    f("qgamma", Distributions.class, 11);

    f("dlnorm", Distributions.class, 11);
    f("plnorm", Distributions.class, 11);
    f("qlnorm", Distributions.class, 11);

    f("dlogis", Distributions.class, 11);
    f("plogis", Distributions.class, 11);
    f("qlogis", Distributions.class, 11);

    f("dnbinom", Distributions.class, 11);
    f("pnbinom", Distributions.class, 11);
    f("qnbinom", Distributions.class, 11);

    f("dnorm", Distributions.class, 11);
    f("pnorm", Distributions.class, 11);
    f("qnorm", Distributions.class, 11);

    f("dunif", Distributions.class, 11);
    f("punif", Distributions.class, 11);
    f("qunif", Distributions.class, 11);

    f("dweibull", Distributions.class, 11);
    f("pweibull", Distributions.class, 11);
    f("qweibull", Distributions.class, 11);

    f("dnchisq", Distributions.class, 11);
    f("pnchisq", Distributions.class, 11);
    f("qnchisq", Distributions.class, 11);

    f("dnt", Distributions.class, 11);
    f("pnt", Distributions.class , 11);
    f("qnt", Distributions.class, 11);

    f("dwilcox", Distributions.class, 11);
    f("pwilcox", Distributions.class, 11);
    f("qwilcox", Distributions.class, 11);

    f("besselI", /*math3*/ null, 11);
    f("besselK", /*math3*/ null, 11);

    f("dnbinom_mu", Distributions.class, 11);
    f("pnbinom_mu", Distributions.class, 11);
    f("qnbinom_mu", Distributions.class, 11);


/* Mathematical Functions of Four Numeric (+ 1-2 int) Variables */

    f("dhyper", Distributions.class, 11);
    f("phyper", Distributions.class, 11);
    f("qhyper", null, 11);

    f("dnbeta", Beta.class, 11);
    f("pnbeta", Beta.class, 11);
    f("qnbeta", Beta.class, 11);

    f("dnf", Distributions.class , 11);
    f("pnf", Distributions.class, 11);
    f("qnf", Distributions.class, 11);

    /* Where is this primitive? (dtukey) I could'nt find it in C source */
    f("dtukey", /*math4*/ null, 11);
    f("ptukey", Distributions.class, 11);
    f("qtukey", Distributions.class, 11);

/* Random Numbers */

    f("rchisq", RNG.class, 11);
    f("rexp", RNG.class, 11);
    f("rgeom", RNG.class, 11);
    f("rpois", RNG.class, 11);
    f("rt", RNG.class, 11);
    f("rsignrank", RNG.class, 11);

    f("rbeta", RNG.class, 11);
    f("rbinom", RNG.class, 11);
    f("rcauchy",RNG.class, 11);
    f("rf", RNG.class, 11);
    f("rgamma", RNG.class, 11);
    f("rlnorm", RNG.class, 11);
    f("rlogis", RNG.class, 11);
    f("rnbinom",RNG.class, 11);
    f("rnbinom_mu", RNG.class , 11);
    f("rnchisq", RNG.class, 11);
    f("rnorm", RNG.class, 11);
    f("runif", RNG.class, 11);
    f("rweibull", RNG.class, 11);
    f("rwilcox", RNG.class, 11);

    f("rhyper", RNG.class, 11);

    f("rmultinom", RNG.class, 11);
    f("sample", Sampling.class, 11);

    f("RNGkind", RNG.class, 11);
    f("set.seed", RNG.class, 11);

/* Data Summaries */
/* sum, min, max, prod, range are group generic and so need to eval args */
    f("sum", Summary.class, 1);
    f("mean", Summary.class, 11);
    f("min", Summary.class, 1);
    f("max", Summary.class, 1);
    f("prod", Summary.class, 1);
    f("range", Summary.class, 1);
    f("cov", Covariance.class, 11);
    f("cor", Covariance.class, 11);

/* Note that the number of arguments in this group only applies
   to the default method */
    f("cumsum", Summary.class, 1);
    f("cumprod", Summary.class, 1);
    f("cummax", Summary.class, 1);
    f("cummin", Summary.class, 1);

/* Type coercion */

    f("as.character", Vectors.class, "asCharacter", 1);
    f("as.integer", Vectors.class, "asInteger", 1);
    f("as.double", Vectors.class, "asDouble", 1);
    f("as.complex", Vectors.class, 1);
    f("as.logical", Vectors.class, "asLogical", 1);
    f("as.raw", Vectors.class, 1);
    f("as.vector", Vectors.class, 11);
    f("paste", Text.class, 11);
    f("file.path", Text.class, 11);
    f("format", Text.class, 11);
    f("format.info", /*formatinfo*/ null, 11);
    f("cat", Cat.class, 111);
    add(new CallFunction());
    f("do.call", Evaluation.class, 211);
    f("as.call", Types.class, 1);
    f("type.convert", Scan.class, 11);
    f("as.environment", Environments.class, "asEnvironment", 1);
    f("storage.mode<-", Vectors.class, 1);


/* String Manipulation */

    f("nchar", Text.class, 11);
    f("nzchar", Text.class, 1);
    f("substr", Text.class, 11);
    f("substr<-", Text.class, 11);
    f("strsplit", Text.class, 11);
    f("abbreviate", /*abbrev*/ null, 11);
    f("make.names", Text.class, 11);
    f("grep", Text.class, 11);
    f("grepl", Text.class, 11);
    f("sub", Text.class, 11);
    f("gsub", Text.class, 11);
    f("regexpr", Text.class, 11);
    f("gregexpr", /*gregexpr*/ null, 11);
    f("agrep", Text.class, 11);
    f("tolower", Text.class, 11);
    f("toupper", Text.class, 11);
    f("chartr", Text.class, 11);
    f("sprintf", Text.class, 11);
    f("make.unique", Text.class, 11);
    f("charToRaw", Vectors.class, 11);
    f("rawToChar", Vectors.class, 11);
    f("rawShift", Vectors.class , 11);
    f("intToBits", Vectors.class, 11);
    f("rawToBits", Vectors.class , 11);
    f("packBits", /*packBits*/ null, 11);
    f("utf8ToInt", Text.class, 11);
    f("intToUtf8", Text.class, 11);
    f("encodeString",Text.class, 11);
    f("iconv", Text.class, 11);
    f("strtrim", Text.class, 11);
    f("strtoi", Text.class, 11);
   
/* Type Checking (typically implemented in ./coerce.c ) */

    f("is.null", Types.class,   /*NILSXP*/ 1);
    f("is.logical", Types.class , /*LGLSXP*/ 1);
    f("is.integer", Types.class,  /*INTSXP*/ 1);
    f("is.real", Types.class,  /*REALSXP */ 1);
    f("is.double", Types.class,  /*REALSXP*/ 1);
    f("is.complex", Types.class, /*CPLXSXP*/ 1);
    f("is.character", Types.class,  /*STRSXP*/ 1);
    f("is.symbol", Types.class,   /*SYMSXP*/ 1);
    f("is.environment", Types.class, "isEnvironment", /* ENVSXP */ 1);
    f("is.list", Types.class,"isList", /* VECSXP */ 1);
    f("is.pairlist", Types.class, "isPairList"/*LISTSXP */ 1);
    f("is.expression", Types.class, "isExpression",   /* EXPRSXP*/ 1);
    f("is.raw", Types.class , /* RAWSXP */ 1);

    f("is.object", Types.class, 1);

    f("is.numeric", Types.class, 1);
    f("is.matrix", Types.class, 1);
    f("is.array", Types.class, 1);

    f("is.atomic", Types.class, 1);
    f("is.recursive", Types.class, 1);

    f("is.call",  Types.class, 1);
    f("is.language", Types.class, 1);
    f("is.function", Types.class, 1);

    f("is.single", Types.class, 1);

    f("is.vector", Types.class, 11);
    f("is.na", Types.class, 1);
    f("is.nan", Types.class, 1);
    f("is.finite", Types.class, 1);
    f("is.infinite", Types.class, 1);


/* Miscellaneous */

    f("proc.time", System.class, 1);
    f("gc.time", /*gctime*/ null, 1);
    f("Version", System.class, 11);
    f("machine", System.class, 11);
    f("commandArgs", System.class, 11);
    f("unzip", Files.class, 111);
    f("system", System.class, 211);
    f("parse", Evaluation.class, 11);
    f("parse_Rd", /*parseRd*/ null, 11);
    f("save", Serialization.class, 111);
    f("saveToConn", Serialization.class, 111);
    f("load", /*load*/ null, 111);
    f("loadFromConn2", Serialization.class, 111);
    f("serializeToConn", Serialization.class, 111);
    f("unserializeFromConn", Serialization.class, 111);
    f("deparse", Deparse.class, 11);
    f("deparseRd", /*deparseRd*/ null, 11);
    f("dput", /*dput*/ null, 111);
    f("dump", /*dump*/ null, 111);
    add(new SubstituteFunction());
    add(new QuoteFunction());// f("quote", Evaluation.class, 0, 0, 1);
    f("quit", Session.class, 111);
    f("interactive", Session.class, 0);
    f("readline", /*readln*/ null, 11);
    f("menu", Session.class, 11);
    f("print.default", Print.class, 111);
    f("print.function", Print.class, 111);
    f("prmatrix", /*prmatrix*/ null, 111);
    f("invisible", Types.class, 101);
    f("gc", System.class, 11);
    f("gcinfo", /*gcinfo*/ null, 11);
    f("gctorture", /*gctorture*/ null, 11);
    f("memory.profile", /*memoryprofile*/ null, 11);
    add(new RepFunction());
    f("rep.int", Sequences.class, 11);
    f("seq.int", Sequences.class, 0);
    f("seq_len", Sequences.class, 1);
    f("seq_along", Sequences.class, "seqAlong", 1);
    f("list", Vectors.class, "list", 1);
    f("split",  Split.class, 11);
    f("is.loaded", /*isloaded*/ null, -1);
    f(".C", Native.class, -1);
    f(".Fortran", Native.class, -1);
    f(".External", /*External*/ null, -1);
    f(".Call", Native.class, -1);
    f(".External.graphics", /*Externalgr*/ null, 1);
    f(".Call.graphics", /*dotcallgr*/ null, 1);
    f("recordGraphics", /*recordGraphics*/ null, 211);
    f("dyn.load", null, 111);
    f("dyn.unload", null, 111);
    f("ls", Environments.class, 11);
    f("typeof", Types.class, 11);
    f("eval", Evaluation.class, 211);
    f("eval.with.vis",Evaluation.class, 211);
    f("withVisible", /*withVisible*/ null, 10);
    add(new ExpressionFunction());
    f("sys.parent", Contexts.class, 11);
    f("sys.call", Contexts.class, 11);
    f("sys.frame", Contexts.class, 11);
    f("sys.nframe", Contexts.class, 11);
    f("sys.calls", Contexts.class, 11);
    f("sys.frames", Contexts.class, 11);
    f("sys.on.exit", Contexts.class, 11);
    f("sys.parents", Contexts.class, 11);
    f("sys.function", Contexts.class, 11);
    f("browserText", /*sysbrowser*/ null, 11);
    f("browserCondition", /*sysbrowser*/ null, 11);
    f("browserSetDebug", /*sysbrowser*/ null, 111);
    f("parent.frame", Contexts.class, "parentFrame", 11);
    f("sort", Sort.class, 11);
    f("xtfrm", Sort.class, 1);
    f("is.unsorted", Sort.class, 11);
    f("psort", Sort.class, null, 11);
    f("qsort", Sort.class, 11);
    f("radixsort", /*radixsort*/ null, 11);
    f("order", Sort.class, 11);
    f("rank", /*rank*/ null, 11);
    f("missing", Evaluation.class, "missing", 0);
    f("nargs", Evaluation.class, 0);
    f("scan", Scan.class, 11);
    f("count.fields", /*countfields*/ null, 11);
    f("readTableHead", Scan.class, 11);
    f("t.default", Matrices.class, 11);
    f("aperm", Matrices.class, 11);
    f("builtins", /*builtins*/ null, 11);
    f("edit", /*edit*/ null, 11);
    f("dataentry", /*dataentry*/ null, 11);
    f("dataviewer", /*dataviewer*/ null, 111);
    f("args", /*args*/ null, 11);
    f("formals", Types.class, 11);
    f("body", Types.class, 11);
    f("bodyCode", /*bodyCode*/ null, 11);
    f("emptyenv", Environments.class, 1);
    f("baseenv", Environments.class, 1);
    f("globalenv", Environments.class, 1);
    f("environment", Environments.class, 11);
    f("environment<-", Environments.class, 2);
    f("environmentName", Environments.class, 11);
    f("env2list", Environments.class, 11);
    f("reg.finalizer", /*regFinaliz*/ null, 11);
    f("options", Types.class, 211);
    f("sink", Connections.class, 111);
    f("sink.number", /*sinknumber*/ null, 11);
    f("lib.fixup", Types.class, 111);
    f("pos.to.env", /*pos2env*/ null, 1);
    f("eapply", /*eapply*/ null, 10);
    f("lapply", Evaluation.class, 10);
    f("vapply", Evaluation.class, 10);
    f("rapply", /*rapply*/ null, 11);
    f("islistfactor",  Types.class, 11);
    f("colSums", Matrices.class, 11);
    f("colMeans", Matrices.class, 11);
    f("rowSums", Matrices.class, 11);
    f("rowMeans", Matrices.class, 11);
    f("Rprof", /*Rprof*/ null, 11);
    f("Rprofmem", /*Rprofmem*/ null, 11);
    f("tracemem", /*memtrace*/ null, 1);
    f("retracemem", /*memretrace*/ null, 1);
    f("untracemem", /*memuntrace*/ null, 101);
    f("object.size", /*objectsize*/ null, 11);
    f("inspect", /*inspect*/ null, 111);
    f("mem.limits", /*memlimits*/ null, 11);
// Internal merge function is replaced with pure R code //  f("merge", /*merge*/ null, 11);
    f("capabilities", System.class, 11);
    f("capabilitiesX11", /*capabilitiesX11*/ null, 11);
    f("new.env", Environments.class, 11);
    f("parent.env", Environments.class, 11);
    f("parent.env<-", Environments.class, 2);
    f("visibleflag", /*visibleflag*/ null, 1);
    f("l10n_info", /*l10n_info*/ null, 11);
    f("Cstack_info", /*Cstack_info*/ null, 11);
    f("startHTTPD", /*startHTTPD*/ null, 11);
    f("stopHTTPD", /*stopHTTPD*/ null, 11);

/* Functions To Interact with the Operating System */

    f("file.show", /*fileshow*/ null, 111);
    f("file.edit", /*fileedit*/ null, 111);
    f("file.create", Files.class, 11);
    f("file.remove", /*fileremove*/ null, 11);
    f("file.rename", /*filerename*/ null, 11);
    f("file.append", Files.class, 11);
    f("codeFiles.append", /*fileappend*/ null, 11);
    f("file.symlink", /*filesymlink*/ null, 11);
    f("file.copy", Files.class, 11);
    f("list.files", Files.class, 11);
    f("file.exists", Files.class, 11);
    f("file.choose", /*filechoose*/ null, 11);
    f("file.info", Files.class, 11);
    f("file.access", Files.class, 11);
    f("dir.create", Files.class, 11);
    f("tempfile", Files.class, 11);
    f("tempdir", Files.class, 11);
    f("R.home", System.class, "getRHome", 11);
    f("date", System.class, 11);
    f("index.search", /*indexsearch*/ null, 11);
    f("Sys.getenv", System.class, 11);
    f("Sys.setenv", System.class, 111);
    f("Sys.unsetenv", System.class, 111);
    f("getwd", Files.class, 11);
    f("setwd", Files.class, 111);
    f("basename", Files.class, 11);
    f("dirname", Files.class, 11);
    f("dirchmod", System.class, 111);
    f("Sys.chmod", System.class, 111);
    f("Sys.umask", System.class, 111);
    f("Sys.readlink", /*readlink*/ null, 11);
    f("Sys.info", System.class, 11);
    f("Sys.sleep", System.class, 11);
    f("Sys.getlocale", System.class, 11);
    f("Sys.setlocale", System.class, 11);
    f("Sys.localeconv", /*localeconv*/ null, 11);
    f("path.expand", Files.class, "pathExpand", 11);
    f("Sys.getpid",System.class, 11);
    f("normalizePath", Files.class, 11);
    f("Sys.glob", Files.class, "glob", 11);
    f("unlink", Files.class, 111);

/* Complex Valued Functions */
    f("fft", FFT.class, 11);
    f("mvfft", /*mvfft*/ null, 11);
    f("nextn", /*nextn*/ null, 11);
    f("polyroot", /*polyroot*/ null, 11);

/* Device Drivers */


/* Graphics */

    f("dev.control", /*devcontrol*/ null, 111);
    f("dev.displaylist", /*devcontrol*/ null, 111);
    f("dev.copy", /*devcopy*/ null, 111);
    f("dev.cur", /*devcur*/ null, 111);
    f("dev.next", /*devnext*/ null, 111);
    f("dev.off", /*devoff*/ null, 111);
    f("dev.prev", /*devprev*/ null, 111);
    f("dev.set", /*devset*/ null, 111);
    f("rgb", RgbHsv.class, 11);
    f("rgb256", RgbHsv.class, 11);
    f("rgb2hsv", RgbHsv.class, 11);
    f("hsv", RgbHsv.class, 11);
    f("hcl", /*hcl*/ null, 11);
    f("gray", RgbHsv.class, 11);
    f("colors", /*colors*/ null, 11);
    f("col2rgb", RgbHsv.class, 11);
    f("palette", /*palette*/ null, 11);
    f("plot.new", Plot.class, 111);
    f("plot.window", Plot.class, 111);
    f("axis", Plot.class, 111);
    f("plot.xy", /*plot_xy*/ null, 111);
    f("text", /*text*/ null, 111);
    f("mtext", /*mtext*/ null, 111);
    f("title", Plot.class, 111);
    f("abline", /*abline*/ null, 111);
    f("box", null, 111);
    f("rect", Plot.class, 111);
    f("polygon", null, 111);
    f("xspline", null, 111);
    f("par", Par.class, 11);
    f("segments", /*segments*/ null, 111);
    f("arrows", /*arrows*/ null, 111);
    f("layout", /*layout*/ null, 111);
    f("locator", /*locator*/ null, 11);
    f("identify", /*identify*/ null, 211);
    f("strheight", /*strheight*/ null, 11);
    f("strwidth", /*strwidth*/ null, 11);
    f("contour", /*contour*/ null, 11);
    f("contourLines", /*contourLines*/ null, 11);
    f("image", /*image*/ null, 111);
    f("dend", /*dend*/ null, 111);
    f("dend.window", /*dendwindow*/ null, 111);
    f("erase", /*erase*/ null, 111);
    f("persp", /*persp*/ null, 111);
    f("filledcontour", /*filledcontour*/ null, 111);
    f("getSnapshot", /*getSnapshot*/ null, 111);
    f("playSnapshot", /*playSnapshot*/ null, 111);
    f("symbols", /*symbols*/ null, 111);
    f("getGraphicsEvent", /*getGraphicsEvent*/ null, 11);
    f("devAskNewPage", /*devAskNewPage*/ null, 211);
    f("dev.size", /*devsize*/ null, 11);
    f("clip", /*clip*/ null, 111);
    f("grconvertX", Graphics.class, 11);
    f("grconvertY", Graphics.class, 11);

/* Objects */
    f("inherits", Attributes.class, 11);
    f("UseMethod", S3.class, 200);
    f("NextMethod", S3.class, 210);
    f("standardGeneric", Methods.class, 201);

/* Modelling Functionality */

    f("nlm", Optimizations.class, 11);
    f("fmin", Optimizations.class, 11);
    f("zeroin", /*zeroin*/ null, 11);
    f("zeroin2", Roots.class, 11);
    f("optim", Optimizations.class, 11);
    f("optimhess", /*optimhess*/ null, 11);
    f("terms.formula", Models.class, 11);
    f("update.formula", /*updateform*/ null, 11);
    f("model.frame", Models.class, 11);
    f("model.matrix", Models.class, 11);

    f("D", /*D*/ null, 11);
    f("deriv.default", /*deriv*/ null, 11);

/* History manipulation */
    f("loadhistory", /*loadhistory*/ null, 11);
    f("savehistory", /*savehistory*/ null, 11);
    f("addhistory", /*addhistory*/ null, 11);

/* date-time manipulations */
    f("Sys.time", Time.class, 11);
    f("as.POSIXct", Time.class, 11);
    f("as.POSIXlt", Time.class, 11);
    f("format.POSIXlt", Time.class, 11);
    f("strptime", Time.class, 11);
    f("Date2POSIXlt", Time.class, 11);
    f("POSIXlt2Date", Time.class, 11);


/* Connections */
    f("stdin", Connections.class, 11);
    f("stdout", Connections.class, 11);
    f("stderr", Connections.class, 11);
    f("readLines",Connections.class, 11);
    f("writeLines", Connections.class, 11);
    f("readBin", /*readbin*/ null, 11);
    f("writeBin", /*writebin*/ null, 211);
    f("readChar", Connections.class, 11);
    f("writeChar", /*writechar*/ null, 211);
    f("open", Connections.class, 11);
    f("isOpen", Connections.class, 11);
    f("isIncomplete", /*isincomplete*/ null, 11);
    f("isSeekable", /*isseekable*/ null, 11);
    f("close", Connections.class, 11);
    f("flush", /*flush*/ null, 11);
    f("file", Connections.class, 11);
    f("url", Connections.class, 11);
    f("pipe", /*pipe*/ null, 11);
    f("fifo", /*fifo*/ null, 11);
    f("gzfile", Connections.class, 11);
    f("bzfile", /*gzfile*/ null, 11);
    f("xzfile", /*gzfile*/ null, 11);
    f("unz", /*unz*/ null, 11);
    f("seek", /*seek*/ null, 11);
    f("truncate", /*truncate*/ null, 11);
    f("pushBack", Connections.class, 11);
    f("clearPushBack", null, 11);
    f("pushBackLength", Connections.class, 11);
    f("rawConnection", /*rawconnection*/ null, 11);
    f("rawConnectionValue", /*rawconvalue*/ null, 11);
    f("textConnection",  Connections.class, 11);
    f("textConnectionValue", /*textconvalue*/ null, 11);
    f("socketConnection", Connections.class, 11);
    f("sockSelect", /*sockselect*/ null, 11);
    f("getConnection", /*getconnection*/ null, 11);
    f("getAllConnections", /*getallconnections*/ null, 11);
    f("summary.connection", Connections.class, 11);
    f("download", /*download*/ null, 11);
    f("nsl", /*nsl*/ null, 11);
    f("gzcon", /*gzcon*/ null, 11);
    f("memCompress", /*memCompress*/ null, 11);
    f("memDecompress", /*memDecompress*/ null, 11);

    f("readDCF", DebianControlFiles.class, 11);

    f("getNumRtoCConverters", /*getNumRtoCConverters*/ null, 11);
    f("getRtoCConverterDescriptions", /*getRtoCConverterDescriptions*/ null, 11);
    f("getRtoCConverterStatus", /*getRtoCConverterStatus*/ null, 11);
    f("setToCConverterActiveStatus", /*setToCConverterActiveStatus*/ null, 11);
    f("removeToCConverterActiveStatus", /*setToCConverterActiveStatus*/ null, 11);

    f("lockEnvironment", Environments.class, 111);
    f("environmentIsLocked", Environments.class, 11);
    f("lockBinding", Environments.class, 111);
    f("unlockBinding", Environments.class, 111);
    f("bindingIsLocked", Environments.class, 11);
    f("makeActiveBinding", /*mkActiveBnd*/ null, 111);
    f("bindingIsActive", /*bndIsActive*/ null, 11);
/* looks like mkUnbound is unused in base R */
    f("mkUnbound", /*mkUnbound*/ null, 111);
    f("isNamespace", Namespaces.class, 0);
  // hiding:  f("registerNamespace", Namespaces.class, 0, 11, 2);
   // hiding: f("unregisterNamespace", Namespaces.class, 0, 11, 1);
    f("getNamespace", Namespaces.class, 0);
    f("getRegisteredNamespace",Namespaces.class, 11);
    f("loadedNamespaces", Namespaces.class, 0);
   
    //hiding: f("getNamespaceRegistry", Namespaces.class, 0, 11, 0);
   // hiding f("importIntoEnv", Namespaces.class, 0, 11, 4);
    f("env.profile", /*envprofile*/ null, 211);
    f(":::", Namespaces.class, 0);
    f("::", Namespaces.class, 0);
    f("getDataset", Namespaces.class, 11);
   
    f("write.table", /*writetable*/ null, 111);
    f("Encoding", Types.class, 11);
    f("setEncoding", Types.class, 11);
  // REMOVED: f("lazyLoadDBfetch", Serialization.class, 0, 1, 4);
    f("setTimeLimit", /*setTimeLimit*/ null, 111);
    f("setSessionTimeLimit", /*setSessionTimeLimit*/ null, 111);
    f("icuSetCollate", /*ICUset*/ null, 111) ;
   
    // jvm specific
    f("import", Jvmi.class, 0);
    f("jload", Jvmi.class, 0);
    f("library", Packages.class, 0);
    f("require", Packages.class, 0);

  }

  private void add(SpecialFunction fn) {
    builtins.put(Symbol.get(fn.getName()), fn);
  }

  private void add(Entry entry) {    
    if (entry.isInternal()) {
      internalEntries.put(Symbol.get(entry.name), entry);
    } else {
      builtinEntries.put(Symbol.get(entry.name), entry);
    }
  }

  private void addInternal(String name, PrimitiveFunction fn) {
    internals.put(Symbol.get(fn.getName()), fn);
  }


  private void f(String name, Class clazz, int eval) {
    Entry e = new Entry();
    e.name = name;
    e.functionClass = clazz;
    e.eval = eval;
    add(e);
  }

  private void f(String name, Class clazz, String methodName, int eval) {
    Entry e = new Entry();
    e.name = name;
    e.functionClass = clazz;
    e.methodName = methodName;
    e.eval = eval;
    add(e);
  }


  public static class Entry {

    private Entry() {

    }

    public boolean isInternal() {
      return ((eval % 100) / 10) != 0;
    }

    private Entry(String name, Class functionClass, String methodName, int eval) {
      this.name = name;
      this.functionClass = functionClass;
      this.methodName = methodName;
      this.eval = eval;
    }

    /**
     * print name
     */
    public String name;

    public String group;

    /* c-code address */
    public Class functionClass;
    public String methodName;
    public int eval;     /* evaluate args? */

    public Entry group(String groupName) {
      this.group = groupName;
      return this;
    }

    public boolean isSpecial() {
      return eval % 10 == 0;
    }

    public boolean isGroupGeneric() {
      return group != null;
    }
  }
}
TOP

Related Classes of org.renjin.primitives.Primitives

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.