(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* Last modified on Sun Apr 14 16:30:31 PDT 1996 by heydon *) MODULE RandomImpl; IMPORT JunoScope, Atom, Random, ExternalProc, JunoArgs, RTVal; FROM ExternalProc IMPORT Closure, Bind; VAR (*CONST*) Generator := NEW(Random.Default).init(); ModSym := Atom.FromText("Random"); Real01Sym := Atom.FromText("Real01"); RealSym := Atom.FromText("Real"); IntSym := Atom.FromText("Int"); PROCEDURE New(): JunoScope.Mod = VAR scp := JunoScope.New(NIL, size := 1); res := NEW(JunoScope.Mod, public_scp := scp, scp := scp); BEGIN ExternalProc.SetupBind(ModSym, scp); Bind(Real01Sym, NEW(Closure, invoke := Real01Proc), in := 0, out := 1); Bind(RealSym, NEW(Closure, invoke := RealProc), in := 2, out := 1); Bind(IntSym, NEW(Closure, invoke := IntProc), in := 2, out := 1); RETURN res END New; PROCEDURE Real01Proc(<*UNUSED*> cl: Closure): BOOLEAN = BEGIN JunoArgs.WriteValue(1, RTVal.FromReal(Generator.real(0.0, 1.0))); RETURN TRUE END Real01Proc; PROCEDURE RealProc(<*UNUSED*> cl: Closure): BOOLEAN = VAR err := FALSE; lo := JunoArgs.ReadReal(2, (*INOUT*) err); hi := JunoArgs.ReadReal(1, (*INOUT*) err); BEGIN IF NOT err AND lo < hi THEN JunoArgs.WriteValue(3, RTVal.FromReal(Generator.real(lo, hi))); RETURN TRUE END; RETURN FALSE END RealProc; PROCEDURE IntProc(<*UNUSED*> cl: Closure): BOOLEAN = VAR err := FALSE; lo := JunoArgs.ReadInt(2, (*INOUT*) err); hi := JunoArgs.ReadInt(1, (*INOUT*) err); BEGIN IF NOT err AND lo < hi THEN JunoArgs.WriteValue(3, RTVal.FromInt(Generator.integer(lo, hi-1))); RETURN TRUE END; RETURN FALSE END IntProc; BEGIN END RandomImpl.