zeolite-lang-0.24.0.0: example/random/random-demo.0rx
concrete RandomDemo {
@type run () -> ()
}
define RandomDemo {
run () {
Float timeLimit <- 0.0
Float startTime <- Realtime.monoSeconds()
if (Argv.global().size() > 1) {
timeLimit <- ParseChars.float(Argv.global().readAt(1)).getValue()
}
// Rough distribution of letter frequencies in the English language.
// Taken from https://en.wikipedia.org/wiki/Letter_frequency.
// NOTE: The overall scale here doesn't matter; it just matters what the
// relative weights are. CategoricalTree only supports positive Int weights.
CategoricalTree<Char> weights <- CategoricalTree<Char>.new()
.setWeight('a', 8167)
.setWeight('b', 1492)
.setWeight('c', 2782)
.setWeight('d', 4253)
.setWeight('e', 12702)
.setWeight('f', 2228)
.setWeight('g', 2015)
.setWeight('h', 6094)
.setWeight('i', 6966)
.setWeight('j', 153)
.setWeight('k', 772)
.setWeight('l', 4025)
.setWeight('m', 2406)
.setWeight('n', 6749)
.setWeight('o', 7507)
.setWeight('p', 1929)
.setWeight('q', 95)
.setWeight('r', 5987)
.setWeight('s', 6327)
.setWeight('t', 9056)
.setWeight('u', 2758)
.setWeight('v', 978)
.setWeight('w', 2361)
.setWeight('x', 150)
.setWeight('y', 1974)
.setWeight('z', 74)
Generator<Char> letter <- weights `RandomCategorical:sampleWith` RandomUniform.probability()
Generator<Float> length <- RandomGaussian.new(5.0, 3.0)
Generator<Float> timing <- RandomExponential.new(4.0)
while (timeLimit <= 0.0 || Realtime.monoSeconds() < startTime+timeLimit) {
// Generate a word with a random length.
Int wordLength <- length.generate().asInt()
if (wordLength < 1) {
continue
}
CharBuffer buffer <- CharBuffer.new(wordLength)
// Populate the letters using their relative frequencies.
traverse (Counter.zeroIndexed(buffer.size()) -> Int pos) {
\ buffer.writeAt(pos, letter.generate())
}
// Print the word.
\ BasicOutput.stdout()
.write(String.fromCharBuffer(buffer))
.write("\n")
.flush()
// Wait a random amount of time.
\ Realtime.sleepSeconds(timing.generate())
}
}
}