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