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

75 lines
1.7 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);
}
}