Initial check-in of 99 Bottles Of Beer

using different methods (simple, iterator, tail-call, pattern match)
This commit is contained in:
Peter Hull 2010-09-20 22:08:28 +01:00 committed by Graydon Hoare
parent 4a3404803b
commit f6e3e6903b
6 changed files with 269 additions and 0 deletions

View File

@ -0,0 +1,67 @@
/* -*- 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;
fn b1() -> str {
ret "# of beer on the wall, # of beer.";
}
fn b2() -> str {
ret "Take one down and pass it around, # of beer on the wall.";
}
fn b7() ->str {
ret "No more bottles of beer on the wall, no more bottles of beer.";
}
fn b8() -> str {
ret "Go to the store and buy some more, # of beer on the wall.";
}
fn sub(str t, int n) -> str {
let str b = "";
let uint i = 0u;
let str ns;
alt (n) {
case (0) {
ns = "no more bottles";
}
case (1) {
ns = "1 bottle";
}
case (_) {
ns = _int.to_str(n, 10u) + " bottles";
}
}
while (i < _str.byte_len(t)) {
if (t.(i) == ('#' as u8)) {
b += ns;
}
else {
b += t.(i);
}
i += 1u;
}
ret b;
}
/* Using an interator */
iter ninetynine() -> int {
let int n = 100;
while (n > 1) {
n -= 1;
put n;
}
}
fn main() {
for each (int n in ninetynine()) {
log sub(b1(), n);
log sub(b2(), n-1);
log "";
}
log b7();
log b8();
}

View File

@ -0,0 +1,75 @@
/* -*- 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);
}
}

View File

@ -0,0 +1,61 @@
/* -*- 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;
fn b1() -> str {
ret "# of beer on the wall, # of beer.";
}
fn b2() -> str {
ret "Take one down and pass it around, # of beer on the wall.";
}
fn b7() ->str {
ret "No more bottles of beer on the wall, no more bottles of beer.";
}
fn b8() -> str {
ret "Go to the store and buy some more, # of beer on the wall.";
}
fn sub(str t, int n) -> str {
let str b = "";
let uint i = 0u;
let str ns;
alt (n) {
case (0) {
ns = "no more bottles";
}
case (1) {
ns = "1 bottle";
}
case (_) {
ns = _int.to_str(n, 10u) + " bottles";
}
}
while (i < _str.byte_len(t)) {
if (t.(i) == ('#' as u8)) {
b += ns;
}
else {
b += t.(i);
}
i += 1u;
}
ret b;
}
/* Straightforward counter */
fn main() {
let int n=99;
while (n > 0) {
log sub(b1(), n);
log sub(b2(), n - 1);
log "";
n -= 1;
}
log b7();
log sub(b8(),99);
}

View File

@ -0,0 +1,43 @@
/* -*- 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;
fn main() {
fn multiple(int 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.";
log "";
if (n > 3) {
be multiple(n - 1);
}
else {
be dual();
}
}
fn 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.";
log "";
be single();
}
fn 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.";
log "";
be none();
}
fn 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.";
log "";
}
multiple(99);
}

View File

@ -0,0 +1,20 @@
RC:=../../../rustboot
RFLAGS:=-L ../../..
TARGETS:= 99bob-simple 99bob-iter 99bob-tail 99bob-pattern
TARGET_X86:=$(addsuffix .x86,$(TARGETS))
TARGET_LLVM:=$(addsuffix .llvm,$(TARGETS))
all : x86s llvms
clean:
rm $(TARGET_X86) $(TARGET_LLVM)
x86s : $(TARGET_X86)
llvms: $(TARGET_LLVM)
%.x86 : %.rs
$(RC) $(RFLAGS) $^ -o $@
%.llvm : %.rs
$(RC) $(RFLAGS) -llvm $^ -o $@

3
src/test/bench/99-bottles/r.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
make -k $1.x86
DYLD_LIBRARY_PATH=../../.. ./$1.x86