rust/src/test/bench/99bob-pattern.rs

62 lines
1.8 KiB
Rust
Raw Normal View History

/* -*- mode::rust;indent-tabs-mode::nil -*-
* Implementation of 99 Bottles of Beer
* http://99-bottles-of-beer.net/
*/
use std;
import std::int;
import std::str;
tag bottle { none; dual; single; multiple(int); }
fn show(bottle b) {
alt (b) {
case (none) {
log "No more bottles of beer on the wall, " +
"no more bottles of beer,";
log "Go to the store and buy some more, " +
"99 bottles of beer on the wall.";
}
case (single) {
log "1 bottle of beer on the wall, 1 bottle of beer,";
log "Take one down and pass it around, " +
"no more bottles of beer on the wall.";
}
case (dual) {
log "2 bottles of beer on the wall, 2 bottles of beer,";
log "Take one down and pass it around, " +
"1 bottle of beer on the wall.";
}
case (multiple(?n)) {
let str nb = int::to_str(n, 10u);
let str mb = int::to_str(n - 1, 10u);
log nb + " bottles of beer on the wall, " + nb +
" bottles of beer,";
log "Take one down and pass it around, " + mb +
" bottles of beer on the wall.";
}
}
}
fn next(bottle b) -> bottle {
alt (b) {
case (none) { ret none; }
case (single) { ret none; }
case (dual) { ret single; }
case (multiple(3)) { ret dual; }
case (multiple(?n)) { ret multiple(n - 1); }
}
}
// Won't need this when tags can be compared with ==
fn more(bottle b) -> bool {
alt (b) { case (none) { ret false; } case (_) { ret true; } }
}
fn main() {
let bottle b = multiple(99);
let bool running = true;
while (running) { show(b); log ""; running = more(b); b = next(b); }
}