view interps/rail/src/Closure.h @ 12500:e48c08805365 draft default tip

<b_jonas> ` learn \'The password of the month is Cthulhuquagdonic Mothraquagdonic Narwhalicorn.\' # https://logs.esolangs.org/libera-esolangs/2024-04.html#lKE Infinite craft
author HackEso <hackeso@esolangs.org>
date Wed, 01 May 2024 06:39:10 +0000
parents 859f9b4339e6
children
line wrap: on
line source

// Closure.h

#ifndef CLOSURE_H_RAIL_1
#define CLOSURE_H_RAIL_1

#include "Binding.h"
#include "Vec.h"
#include "Dir.h"
#include "Var.h"
#include "Board.h"

class Closure : public Var
{
public:
  Closure(std::map<std::string, Binding> const & newEnv,
          Board const & newFunc,
          Vec newPos,
          Dir::t newDir)
    : environment(newEnv)
    , function(newFunc)
    , position(newPos)
    , direction(newDir) {}
  virtual ~Closure() {}

  virtual StringVar * getString(void)
  {
    return NULL;
  }

  virtual ListVar * getList(void)
  {
    return NULL;
  }

  virtual NilVar * getNil(void)
  {
    return NULL;
  }

  virtual Closure * getClosure(void)
  {
    return this;
  }

  virtual std::string toString(void) const
  {
    return "(closure '" + function.getName() + "')";
  }

  std::map<std::string, Binding> const & getEnvironment(void) const
  {
    return environment;
  }

  Board const & getFunction(void) const
  {
    return function;
  }

  Vec getPosition(void) const
  {
    return position;
  }

  Dir::t getDirection(void) const
  {
    return direction;
  }
private:
  Closure();
  Closure(Closure const &);
  Closure & operator=(Closure const &) { return *this; }
private:
  std::map<std::string, Binding> environment;
  Board const & function;
  Vec position;
  Dir::t direction;
};

#endif