erste Übergabe

This commit is contained in:
Christian Fraß 2017-11-08 11:30:34 +01:00
commit e3db24dcab
15 changed files with 593 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
erzeugnis

32
makefile Normal file
View file

@ -0,0 +1,32 @@
erzeugnis/vtm.js: \
quelldatein/basis/typen.ts \
quelldatein/basis/fehlermonade.ts \
quelldatein/helfer/hashmap.ts \
quelldatein/aufbau/richtung.ts \
quelldatein/aufbau/symbol.ts \
quelldatein/aufbau/position.ts \
quelldatein/aufbau/figur.ts \
quelldatein/aufbau/aktor.ts \
quelldatein/aufbau/befoerderer.ts \
quelldatein/aufbau/schreiber.ts \
quelldatein/aufbau/verwerfer.ts \
quelldatein/aufbau/welt.ts \
quelldatein/test.ts
mkdir -p erzeugnis
tsc \
--allowUnreachableCode \
quelldatein/basis/typen.ts \
quelldatein/basis/fehlermonade.ts \
quelldatein/helfer/hashmap.ts \
quelldatein/aufbau/richtung.ts \
quelldatein/aufbau/symbol.ts \
quelldatein/aufbau/position.ts \
quelldatein/aufbau/figur.ts \
quelldatein/aufbau/aktor.ts \
quelldatein/aufbau/befoerderer.ts \
quelldatein/aufbau/schreiber.ts \
quelldatein/aufbau/verwerfer.ts \
quelldatein/aufbau/welt.ts \
quelldatein/test.ts \
--outFile erzeugnis/vtm.js

View file

@ -0,0 +1,20 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export interface schnittstelle_aktor
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
verwenden(figur : klasse_figur) : void;
}
}

View file

@ -0,0 +1,40 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_befoerderer
implements schnittstelle_aktor
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private richtung : typ_richtung;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(richtung : typ_richtung = 0)
{
this.richtung = richtung;
}
/**
* @author kcf <vidofnir@folksprak.org>
* @implementation
*/
public verwenden(figur : klasse_figur) : void
{
figur.bewegen(this.richtung);
}
}
}

119
quelldatein/aufbau/figur.ts Normal file
View file

@ -0,0 +1,119 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_figur
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private band : Array<typ_symbol>;
/**
* @author kcf <vidofnir@folksprak.org>
*/
private position : typ_position;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(band : Array<typ_symbol> = [], position : typ_position = {"u": 0, "v": 0})
{
this.band = band;
this.position = position;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public position_lesen() : typ_position
{
return this.position;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public bewegen(richtung : typ_richtung) : void
{
let summand : typ_position;
switch (richtung)
{
case 0:
{
summand = {"u": +1, "v": 0};
break;
}
case 1:
{
summand = {"u": +1, "v": 0};
break;
}
case 2:
{
summand = {"u": +1, "v": 0};
break;
}
case 3:
{
summand = {"u": +1, "v": 0};
break;
}
case 4:
{
summand = {"u": +1, "v": 0};
break;
}
case 5:
{
summand = {"u": +1, "v": 0};
break;
}
default:
{
let meldung : string = ("ungültige Richtung '" + String(richtung) + "'");
throw (new Error(meldung));
break;
}
}
this.position = {"u": (this.position.u + summand.u), "v": (this.position.v + summand.v)};
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public band_schreiben(symbol : typ_symbol) : void
{
this.band.push(symbol);
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public band_lesen() : schnittstelle_fehlermonade<typ_symbol>
{
if (this.band.length <= 0)
{
return (new klasse_nichts<typ_symbol>());
}
else
{
return (new klasse_schlicht<typ_symbol>(this.band[0]));
}
}
}
}

View file

@ -0,0 +1,20 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export type typ_position = {u : int; v : int;};
/**
* @author kcf <vidofnir@folksprak.org>
*/
export function position_hash(position : typ_position) : string
{
return (position.u.toFixed(0) + "_" + position.v.toFixed(0));
}
}

View file

@ -0,0 +1,11 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export type typ_richtung = int;
}

View file

@ -0,0 +1,48 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_schreiber
implements schnittstelle_aktor
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private symbol : typ_symbol;
/**
* @author kcf <vidofnir@folksprak.org>
*/
private richtung : typ_richtung;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(symbol : int = 0, richtung : int = 0)
{
this.symbol = symbol;
this.richtung = richtung;
}
/**
* @author kcf <vidofnir@folksprak.org>
* @implementation
*/
public verwenden(figur : klasse_figur) : void
{
figur.band_schreiben(this.symbol);
figur.bewegen(this.richtung);
}
}
}

View file

@ -0,0 +1,11 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export type typ_symbol = int;
}

View file

@ -0,0 +1,34 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_verwerfer
implements schnittstelle_aktor
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor()
{
}
/**
* @author kcf <vidofnir@folksprak.org>
* @implementation
*/
public verwenden(figur : klasse_figur) : void
{
// TODO
console.warn("not implemented");
}
}
}

View file

@ -0,0 +1,64 @@
module mod_vtm_aufbau
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_welt
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private felder : mod_vtm_helfer.klasse_hashmap<typ_position, schnittstelle_aktor>;
/**
* @author kcf <vidofnir@folksprak.org>
*/
private figur : klasse_figur;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor
(
felder : mod_vtm_helfer.klasse_hashmap<typ_position, schnittstelle_aktor> = new mod_vtm_helfer.klasse_hashmap<typ_position, schnittstelle_aktor>(position_hash),
figur : klasse_figur = new klasse_figur()
)
{
this.felder = felder;
this.figur = figur;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public feld_setzen(position : typ_position, aktor : schnittstelle_aktor) : void
{
this.felder.setzen(position, aktor);
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public fortfahren() : void
{
let position : typ_position = this.figur.position_lesen();
let aktor_ : schnittstelle_fehlermonade<schnittstelle_aktor> = this.felder.holen(position);
let aktor : schnittstelle_aktor = (aktor_.ist_schlicht() ? aktor_.lesen() : (new klasse_verwerfer()));
let ergebnis : any = aktor.verwenden(this.figur);
//
let position_ : typ_position = this.figur.position_lesen();
console.info(JSON.stringify(position) + " -> " + JSON.stringify(position_));
}
}
}

View file

@ -0,0 +1,99 @@
/**
* @author kcf <vidofnir@folksprak.org>
*/
interface schnittstelle_fehlermonade<typ_wert>
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
ist_schlicht() : boolean;
/**
* @author kcf <vidofnir@folksprak.org>
*/
lesen() : typ_wert;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
class klasse_nichts<typ_wert>
implements schnittstelle_fehlermonade<typ_wert>
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor()
{
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public ist_schlicht() : boolean
{
return false;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public lesen() : typ_wert
{
let meldung : string = "ist nichts";
throw (new Error(meldung));
}
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
class klasse_schlicht<typ_wert>
implements schnittstelle_fehlermonade<typ_wert>
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private wert : typ_wert;
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(wert : typ_wert)
{
this.wert = wert;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public ist_schlicht() : boolean
{
return true;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public lesen() : typ_wert
{
return this.wert;
}
}

View file

@ -0,0 +1,12 @@
/**
* @author kcf <vidofnir@folksprak.org>
*/
type int = number;
/**
* @author kcf <vidofnir@folksprak.org>
*/
type float = number;

View file

@ -0,0 +1,63 @@
module mod_vtm_helfer
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
export class klasse_hashmap<typ_schluessel, typ_wert>
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
private hashfunction : (schluessel : typ_schluessel)=>string;
/**
* @author kcf <vidofnir@folksprak.org>
*/
private speicher : {[hashwert : string] : typ_wert};
/**
* @author kcf <vidofnir@folksprak.org>
*/
public constructor(hashfunction : (schluessel : typ_schluessel)=>string)
{
this.hashfunction = hashfunction;
this.speicher = {};
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public setzen(schluessel : typ_schluessel, wert : typ_wert) : void
{
let hashwert : string = this.hashfunction(schluessel);
this.speicher[hashwert] = wert;
}
/**
* @author kcf <vidofnir@folksprak.org>
*/
public holen(schluessel : typ_schluessel) : schnittstelle_fehlermonade<typ_wert>
{
let hashwert : string = this.hashfunction(schluessel);
if (hashwert in this.speicher)
{
let wert : typ_wert = this.speicher[hashwert];
return (new klasse_schlicht<typ_wert>(wert));
}
else
{
return (new klasse_nichts<typ_wert>());
}
}
}
}

19
quelldatein/test.ts Normal file
View file

@ -0,0 +1,19 @@
module mod_vtm_test
{
/**
* @author kcf <vidofnir@folksprak.org>
*/
function haupt() : void
{
let welt : mod_vtm_aufbau.klasse_welt = new mod_vtm_aufbau.klasse_welt();
welt.feld_setzen({"u": 0, "v": 0}, new mod_vtm_aufbau.klasse_befoerderer(0));
welt.fortfahren();
}
haupt();
}