The Big Book of Small EK9 Programs
Adapted from Al Sweigart's The Big Book of Small Python Projects: 81 Easy Practice Programs (No Starch Press, 2021; copyright © 2021 Al Sweigart), which he makes freely available under a Creative Commons Attribution-NonCommercial-ShareAlike licence at inventwithpython.com/bigbookpython. Changes were made: each program was ported from Python to EK9 and remodelled in EK9's idioms.
Project 50 — Ninety-Nine Bottles
This is project 50 of the book, ported to EK9. Its chapter is still being written; until then, this page shows the port itself: a run of it, the whole program, and how it keeps to the original.
A sample run
Run it with:
ek9 ninetyninebottles.ek9
It prints:
Ninety-Nine Bottles, by Al Sweigart al@inventwithpython.com
(Press Ctrl-C to quit.)
99 bottles of milk on the wall,
99 bottles of milk,
Take one down, pass it around,
98 bottles of milk on the wall!
98 bottles of milk on the wall,
98 bottles of milk,
Take one down, pass it around,
97 bottles of milk on the wall!
97 bottles of milk on the wall,
97 bottles of milk,
Take one down, pass it around,
96 bottles of milk on the wall!
96 bottles of milk on the wall,
96 bottles of milk,
Take one down, pass it around,
95 bottles of milk on the wall!
95 bottles of milk on the wall,
95 bottles of milk,
Take one down, pass it around,
94 bottles of milk on the wall!
94 bottles of milk on the wall,
94 bottles of milk,
Take one down, pass it around,
93 bottles of milk on the wall!
93 bottles of milk on the wall,
93 bottles of milk,
Take one down, pass it around,
92 bottles of milk on the wall!
92 bottles of milk on the wall,
92 bottles of milk,
Take one down, pass it around,
91 bottles of milk on the wall!
91 bottles of milk on the wall,
91 bottles of milk,
Take one down, pass it around,
90 bottles of milk on the wall!
90 bottles of milk on the wall,
90 bottles of milk,
Take one down, pass it around,
89 bottles of milk on the wall!
89 bottles of milk on the wall,
89 bottles of milk,
Take one down, pass it around,
88 bottles of milk on the wall!
88 bottles of milk on the wall,
88 bottles of milk,
Take one down, pass it around,
87 bottles of milk on the wall!
87 bottles of milk on the wall,
87 bottles of milk,
Take one down, pass it around,
86 bottles of milk on the wall!
86 bottles of milk on the wall,
86 bottles of milk,
Take one down, pass it around,
85 bottles of milk on the wall!
85 bottles of milk on the wall,
85 bottles of milk,
Take one down, pass it around,
84 bottles of milk on the wall!
84 bottles of milk on the wall,
84 bottles of milk,
Take one down, pass it around,
83 bottles of milk on the wall!
83 bottles of milk on the wall,
83 bottles of milk,
Take one down, pass it around,
82 bottles of milk on the wall!
82 bottles of milk on the wall,
82 bottles of milk,
Take one down, pass it around,
81 bottles of milk on the wall!
81 bottles of milk on the wall,
81 bottles of milk,
Take one down, pass it around,
80 bottles of milk on the wall!
80 bottles of milk on the wall,
80 bottles of milk,
Take one down, pass it around,
79 bottles of milk on the wall!
79 bottles of milk on the wall,
79 bottles of milk,
Take one down, pass it around,
78 bottles of milk on the wall!
78 bottles of milk on the wall,
78 bottles of milk,
Take one down, pass it around,
77 bottles of milk on the wall!
77 bottles of milk on the wall,
77 bottles of milk,
Take one down, pass it around,
76 bottles of milk on the wall!
76 bottles of milk on the wall,
76 bottles of milk,
Take one down, pass it around,
75 bottles of milk on the wall!
75 bottles of milk on the wall,
75 bottles of milk,
Take one down, pass it around,
74 bottles of milk on the wall!
74 bottles of milk on the wall,
74 bottles of milk,
Take one down, pass it around,
73 bottles of milk on the wall!
73 bottles of milk on the wall,
73 bottles of milk,
Take one down, pass it around,
72 bottles of milk on the wall!
72 bottles of milk on the wall,
72 bottles of milk,
Take one down, pass it around,
71 bottles of milk on the wall!
71 bottles of milk on the wall,
71 bottles of milk,
Take one down, pass it around,
70 bottles of milk on the wall!
70 bottles of milk on the wall,
70 bottles of milk,
Take one down, pass it around,
69 bottles of milk on the wall!
69 bottles of milk on the wall,
69 bottles of milk,
Take one down, pass it around,
68 bottles of milk on the wall!
68 bottles of milk on the wall,
68 bottles of milk,
Take one down, pass it around,
67 bottles of milk on the wall!
67 bottles of milk on the wall,
67 bottles of milk,
Take one down, pass it around,
66 bottles of milk on the wall!
66 bottles of milk on the wall,
66 bottles of milk,
Take one down, pass it around,
65 bottles of milk on the wall!
65 bottles of milk on the wall,
65 bottles of milk,
Take one down, pass it around,
64 bottles of milk on the wall!
64 bottles of milk on the wall,
64 bottles of milk,
Take one down, pass it around,
63 bottles of milk on the wall!
63 bottles of milk on the wall,
63 bottles of milk,
Take one down, pass it around,
62 bottles of milk on the wall!
62 bottles of milk on the wall,
62 bottles of milk,
Take one down, pass it around,
61 bottles of milk on the wall!
61 bottles of milk on the wall,
61 bottles of milk,
Take one down, pass it around,
60 bottles of milk on the wall!
60 bottles of milk on the wall,
60 bottles of milk,
Take one down, pass it around,
59 bottles of milk on the wall!
59 bottles of milk on the wall,
59 bottles of milk,
Take one down, pass it around,
58 bottles of milk on the wall!
58 bottles of milk on the wall,
58 bottles of milk,
Take one down, pass it around,
57 bottles of milk on the wall!
57 bottles of milk on the wall,
57 bottles of milk,
Take one down, pass it around,
56 bottles of milk on the wall!
56 bottles of milk on the wall,
56 bottles of milk,
Take one down, pass it around,
55 bottles of milk on the wall!
55 bottles of milk on the wall,
55 bottles of milk,
Take one down, pass it around,
54 bottles of milk on the wall!
54 bottles of milk on the wall,
54 bottles of milk,
Take one down, pass it around,
53 bottles of milk on the wall!
53 bottles of milk on the wall,
53 bottles of milk,
Take one down, pass it around,
52 bottles of milk on the wall!
52 bottles of milk on the wall,
52 bottles of milk,
Take one down, pass it around,
51 bottles of milk on the wall!
51 bottles of milk on the wall,
51 bottles of milk,
Take one down, pass it around,
50 bottles of milk on the wall!
50 bottles of milk on the wall,
50 bottles of milk,
Take one down, pass it around,
49 bottles of milk on the wall!
49 bottles of milk on the wall,
49 bottles of milk,
Take one down, pass it around,
48 bottles of milk on the wall!
48 bottles of milk on the wall,
48 bottles of milk,
Take one down, pass it around,
47 bottles of milk on the wall!
47 bottles of milk on the wall,
47 bottles of milk,
Take one down, pass it around,
46 bottles of milk on the wall!
46 bottles of milk on the wall,
46 bottles of milk,
Take one down, pass it around,
45 bottles of milk on the wall!
45 bottles of milk on the wall,
45 bottles of milk,
Take one down, pass it around,
44 bottles of milk on the wall!
44 bottles of milk on the wall,
44 bottles of milk,
Take one down, pass it around,
43 bottles of milk on the wall!
43 bottles of milk on the wall,
43 bottles of milk,
Take one down, pass it around,
42 bottles of milk on the wall!
42 bottles of milk on the wall,
42 bottles of milk,
Take one down, pass it around,
41 bottles of milk on the wall!
41 bottles of milk on the wall,
41 bottles of milk,
Take one down, pass it around,
40 bottles of milk on the wall!
40 bottles of milk on the wall,
40 bottles of milk,
Take one down, pass it around,
39 bottles of milk on the wall!
39 bottles of milk on the wall,
39 bottles of milk,
Take one down, pass it around,
38 bottles of milk on the wall!
38 bottles of milk on the wall,
38 bottles of milk,
Take one down, pass it around,
37 bottles of milk on the wall!
37 bottles of milk on the wall,
37 bottles of milk,
Take one down, pass it around,
36 bottles of milk on the wall!
36 bottles of milk on the wall,
36 bottles of milk,
Take one down, pass it around,
35 bottles of milk on the wall!
35 bottles of milk on the wall,
35 bottles of milk,
Take one down, pass it around,
34 bottles of milk on the wall!
34 bottles of milk on the wall,
34 bottles of milk,
Take one down, pass it around,
33 bottles of milk on the wall!
33 bottles of milk on the wall,
33 bottles of milk,
Take one down, pass it around,
32 bottles of milk on the wall!
32 bottles of milk on the wall,
32 bottles of milk,
Take one down, pass it around,
31 bottles of milk on the wall!
31 bottles of milk on the wall,
31 bottles of milk,
Take one down, pass it around,
30 bottles of milk on the wall!
30 bottles of milk on the wall,
30 bottles of milk,
Take one down, pass it around,
29 bottles of milk on the wall!
29 bottles of milk on the wall,
29 bottles of milk,
Take one down, pass it around,
28 bottles of milk on the wall!
28 bottles of milk on the wall,
28 bottles of milk,
Take one down, pass it around,
27 bottles of milk on the wall!
27 bottles of milk on the wall,
27 bottles of milk,
Take one down, pass it around,
26 bottles of milk on the wall!
26 bottles of milk on the wall,
26 bottles of milk,
Take one down, pass it around,
25 bottles of milk on the wall!
25 bottles of milk on the wall,
25 bottles of milk,
Take one down, pass it around,
24 bottles of milk on the wall!
24 bottles of milk on the wall,
24 bottles of milk,
Take one down, pass it around,
23 bottles of milk on the wall!
23 bottles of milk on the wall,
23 bottles of milk,
Take one down, pass it around,
22 bottles of milk on the wall!
22 bottles of milk on the wall,
22 bottles of milk,
Take one down, pass it around,
21 bottles of milk on the wall!
21 bottles of milk on the wall,
21 bottles of milk,
Take one down, pass it around,
20 bottles of milk on the wall!
20 bottles of milk on the wall,
20 bottles of milk,
Take one down, pass it around,
19 bottles of milk on the wall!
19 bottles of milk on the wall,
19 bottles of milk,
Take one down, pass it around,
18 bottles of milk on the wall!
18 bottles of milk on the wall,
18 bottles of milk,
Take one down, pass it around,
17 bottles of milk on the wall!
17 bottles of milk on the wall,
17 bottles of milk,
Take one down, pass it around,
16 bottles of milk on the wall!
16 bottles of milk on the wall,
16 bottles of milk,
Take one down, pass it around,
15 bottles of milk on the wall!
15 bottles of milk on the wall,
15 bottles of milk,
Take one down, pass it around,
14 bottles of milk on the wall!
14 bottles of milk on the wall,
14 bottles of milk,
Take one down, pass it around,
13 bottles of milk on the wall!
13 bottles of milk on the wall,
13 bottles of milk,
Take one down, pass it around,
12 bottles of milk on the wall!
12 bottles of milk on the wall,
12 bottles of milk,
Take one down, pass it around,
11 bottles of milk on the wall!
11 bottles of milk on the wall,
11 bottles of milk,
Take one down, pass it around,
10 bottles of milk on the wall!
10 bottles of milk on the wall,
10 bottles of milk,
Take one down, pass it around,
9 bottles of milk on the wall!
9 bottles of milk on the wall,
9 bottles of milk,
Take one down, pass it around,
8 bottles of milk on the wall!
8 bottles of milk on the wall,
8 bottles of milk,
Take one down, pass it around,
7 bottles of milk on the wall!
7 bottles of milk on the wall,
7 bottles of milk,
Take one down, pass it around,
6 bottles of milk on the wall!
6 bottles of milk on the wall,
6 bottles of milk,
Take one down, pass it around,
5 bottles of milk on the wall!
5 bottles of milk on the wall,
5 bottles of milk,
Take one down, pass it around,
4 bottles of milk on the wall!
4 bottles of milk on the wall,
4 bottles of milk,
Take one down, pass it around,
3 bottles of milk on the wall!
3 bottles of milk on the wall,
3 bottles of milk,
Take one down, pass it around,
2 bottles of milk on the wall!
2 bottles of milk on the wall,
2 bottles of milk,
Take one down, pass it around,
1 bottles of milk on the wall!
1 bottle of milk on the wall,
1 bottle of milk,
Take it down, pass it around,
No more bottles of milk on the wall!
The program
#!ek9 defines module bigbook.bottles defines constant BottlesAtStart <- 99 defines class //THE OUTPUT: everything the listener sees goes through here, worded by Say. The song reads //no input, so there is no LineInput. Console stdout as Stdout: Stdout() say as Say: Say("en") Console() -> words as Say say: words showIntroduction() stdout.println(say.introduction()) //A blank line after each verse is layout, so the Console prints it. showVerse() -> bottles as Integer stdout.println(say.verse(bottles)) stdout.println("") showLastVerse() stdout.println(say.lastVerse()) override operator ? as pure <- rtn as Boolean: true defines function //THE language of the words, copied unchanged from lib/Language.ek9: BIGBOOK_LANG when it //is set (fr, zh, ...), otherwise en. language() <- rtn as String: EnvVars().get("BIGBOOK_LANG") ?: "en" //THE WORDS: every word the listener sees. defines text for "en" Say introduction() `Ninety-Nine Bottles, by Al Sweigart al@inventwithpython.com (Press Ctrl-C to quit.)` //The verse's last line works out one fewer, so nothing changes part way through it. verse() -> bottles as Integer `${bottles} bottles of milk on the wall, ${bottles} bottles of milk, Take one down, pass it around, ${bottles - 1} bottles of milk on the wall!` //The last bottle has its own verse: "bottle", "Take it down", "No more". lastVerse() `1 bottle of milk on the wall, 1 bottle of milk, Take it down, pass it around, No more bottles of milk on the wall!` defines program //Ninety-Nine Bottles (Big Book project 50). Sings the bottles song from 99 bottles down to //none. The game decides; the Console shows, in the reader's words. NinetyNineBottles() //A language with no words of its own is unset: ?: falls back to English. console <- Console(Say(language()) ?: Say("en")) console.showIntroduction() //A range gives each verse its own count, so nothing changes part way through a verse. for bottles in BottlesAtStart ... 2 console.showVerse(bottles) console.showLastVerse()
About this port
- Faithful to the book: verses for 99 down to 2, then a distinct final verse for the last bottle: singular "1 bottle of milk", "Take it down, pass it around," and "No more bottles of milk on the wall!". The verse for 2 ends "1 bottles of milk on the wall!", as the original prints it.
- Idioms: the original decrements its counter part way through each verse. Here a range loop gives each verse its own count and the verse's last line works out
bottles - 1, so nothing changes mid-verse. The literal 2 bounds a for-loop range, which E11064 does not flag (a range used as a test,x in 1 ... 7, is flagged).