Calendar - for "REAL" programmers: Difference between revisions
Content added Content deleted
(Fixing DaysInMonth function for February, try former function with 1968 or 2000 to see why this is necessary.) |
(Added Wren) |
||
Line 4,295: | Line 4,295: | ||
</pre> |
|||
=={{header|Wren}}== |
|||
Strictly speaking, ''real'' programming is impossible in Wren which is case sensitive and keywords, library classes, methods etc. never use all upper case letters. |
|||
We therefore do what other languages in a similar predicament have done and begin by creating an all upper case version of the calendar program called ''calendar_real_uc.txt'': |
|||
{{libheader|Wren-date}} |
|||
{{libheader|Wren-fmt}} |
|||
{{libheader|Wren-seq}} |
|||
<lang ecmascript>IMPORT "/DATE" FOR DATE |
|||
IMPORT "/FMT" FOR FMT |
|||
IMPORT "/SEQ" FOR LST |
|||
VAR CALENDAR = FN.NEW { |YEAR| |
|||
VAR SNOOPY = "🐶" |
|||
VAR DAYS = "SU MO TU WE TH FR SA" |
|||
VAR MONTHS = [ |
|||
"JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", |
|||
"JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" |
|||
] |
|||
FMT.PRINT("$70M", SNOOPY) |
|||
VAR YEARSTR = "--- %(YEAR) ---" |
|||
FMT.PRINT("$70M\N", YEARSTR) |
|||
VAR FIRST = LIST.FILLED(3, 0) |
|||
VAR MLEN = LIST.FILLED(3, 0) |
|||
VAR C = 0 |
|||
FOR (CHUNK IN LST.CHUNKS(MONTHS, 3)) { |
|||
FOR (I IN 0..2) FMT.WRITE("$20M ", CHUNK[I]) |
|||
SYSTEM.PRINT() |
|||
FOR (I IN 0..2) SYSTEM.WRITE("%(DAYS) ") |
|||
SYSTEM.PRINT() |
|||
FIRST[0] = DATE.NEW(YEAR, C*3 + 1, 1).DAYOFWEEK % 7 |
|||
FIRST[1] = DATE.NEW(YEAR, C*3 + 2, 1).DAYOFWEEK % 7 |
|||
FIRST[2] = DATE.NEW(YEAR, C*3 + 3, 1).DAYOFWEEK % 7 |
|||
MLEN[0] = DATE.MONTHLENGTH(YEAR, C*3 + 1) |
|||
MLEN[1] = DATE.MONTHLENGTH(YEAR, C*3 + 2) |
|||
MLEN[2] = DATE.MONTHLENGTH(YEAR, C*3 + 3) |
|||
FOR (I IN 0..5) { |
|||
FOR (J IN 0..2) { |
|||
VAR START = 1 + 7 * I - FIRST[J] |
|||
FOR (K IN START..START+6) { |
|||
IF (K >= 1 && K <= MLEN[J]) { |
|||
FMT.WRITE("$2D ", K) |
|||
} ELSE { |
|||
SYSTEM.WRITE(" ") |
|||
} |
|||
} |
|||
SYSTEM.WRITE(" ") |
|||
} |
|||
SYSTEM.PRINT() |
|||
} |
|||
SYSTEM.PRINT() |
|||
C = C + 1 |
|||
} |
|||
} |
|||
CALENDAR.CALL(1969)</lang> |
|||
We then create a script called ''calendar_real.wren'' which takes the above text file as input, changes those items which cannot be upper case into their normal casing and compiles and runs the result: |
|||
{{libheader|Wren-str}} |
|||
<lang ecmascript>import "io" for File |
|||
import "/str" for Str |
|||
import "meta" for Meta |
|||
var keywords = ["import", "for", "var", "in", "if", "else"] |
|||
var modules = ["/date", "/fmt", "/seq"] |
|||
var classes = ["Date", "Fmt", "Lst", "Fn", "List", "System"] |
|||
var methods = ["print", "filled", "chunks", "write", "new", "dayOfWeek", "monthLength", "call"] |
|||
var formats = ["$70m", "\\n", "$20m", "$2d"] |
|||
var text = File.read("calendar_real_uc.txt") |
|||
for (keyword in keywords) text = text.replace(Str.upper(keyword) + " ", keyword + " ") |
|||
for (module in modules) text = text.replace(Str.upper(module), module) |
|||
for (clazz in classes) text = text.replace(Str.upper(clazz), clazz) |
|||
for (method in methods) text = text.replace("." + Str.upper(method), "." + method) |
|||
for (format in formats) text = text.replace(Str.upper(format), format) |
|||
Meta.compile(text).call()</lang> |
|||
{{out}} |
|||
<pre> |
|||
🐶 |
|||
--- 1969 --- |
|||
JANUARY FEBRUARY MARCH |
|||
SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA |
|||
1 2 3 4 1 1 |
|||
5 6 7 8 9 10 11 2 3 4 5 6 7 8 2 3 4 5 6 7 8 |
|||
12 13 14 15 16 17 18 9 10 11 12 13 14 15 9 10 11 12 13 14 15 |
|||
19 20 21 22 23 24 25 16 17 18 19 20 21 22 16 17 18 19 20 21 22 |
|||
26 27 28 29 30 31 23 24 25 26 27 28 23 24 25 26 27 28 29 |
|||
30 31 |
|||
APRIL MAY JUNE |
|||
SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA |
|||
1 2 3 4 5 1 2 3 1 2 3 4 5 6 7 |
|||
6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 |
|||
13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 |
|||
20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 |
|||
27 28 29 30 25 26 27 28 29 30 31 29 30 |
|||
JULY AUGUST SEPTEMBER |
|||
SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA |
|||
1 2 3 4 5 1 2 1 2 3 4 5 6 |
|||
6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13 |
|||
13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20 |
|||
20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27 |
|||
27 28 29 30 31 24 25 26 27 28 29 30 28 29 30 |
|||
31 |
|||
OCTOBER NOVEMBER DECEMBER |
|||
SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA |
|||
1 2 3 4 1 1 2 3 4 5 6 |
|||
5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 |
|||
12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20 |
|||
19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 |
|||
26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 |
|||
30 |
|||
</pre> |
</pre> |
||