Mercurial > repo
view interps/rail/src/Var.h @ 11686:10d612def8ee draft
<b_jonas> perl -e for $e ("i","u"){ $f="bin/date$e"; open my$i,"<",$f or die "error open $f r"; local$/; $s=<$i> or die; $s=~s/"\\+%Y/\\${d:+-d "\\$d"} $&/ or die; open $o,">",$f or die "error open $f w: $!"; print $o $s or die; close $o or die; print "OK $f\\n" }
author | HackEso <hackeso@esolangs.org> |
---|---|
date | Fri, 04 Jan 2019 21:29:08 +0000 |
parents | 859f9b4339e6 |
children |
line wrap: on
line source
// Var.h // This is the base class for all variables in rail. The // acquire/release is for reference counting, which we will use for // our GC implementation. We can use reference counting here because // the only primitives are cons (':'), lambda ('&'), and stack // operations. No modifications of cons cells or closures are allowed. // The simple tag-based polymorphism here is used because all of the // actions work only on specific well-defined types. Thus we want // to bypass the complex multiple-dispatch pattern. #ifndef VAR_H_RAIL_1 #define VAR_H_RAIL_1 class StringVar; class ListVar; class NilVar; class Closure; class Var { public: Var() : refCount(0) {} virtual ~Var() {} void acquire(void) { ++refCount; } void release(void) { --refCount; if (refCount <= 0) { delete this; } } virtual StringVar * getString(void)=0; virtual ListVar * getList(void)=0; virtual NilVar * getNil(void)=0; virtual Closure * getClosure(void)=0; virtual std::string toString(void) const=0; private: Var(Var const &) {} Var & operator=(Var const &) { return *this; } private: int refCount; }; #endif