Mercurial > repos > other > SevenLanguagesInSevenWeeks
annotate 2-Io/day3-DSL.io @ 43:d2764720ea17
Add the Day 3 'Domain Specific Language'
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Mon, 18 Sep 2017 20:45:32 +0100 |
parents | |
children | 6347bacb3be7 |
rev | line source |
---|---|
43
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
1 # Creating a simple "domain-specific language" |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
2 # (Except it's not really - it's just a little extension to support |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
3 # the "{ key:value[, key:value[…]] }" format of specifying dictionaries) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
4 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
5 # Because this is a string then we can do it at any time! |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
6 OperatorTable addAssignOperator(":", "atPutThing") |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
7 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
8 # curlyBrackets is an automatically invoked function from the parser whenever |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
9 # it encounters curly brackets. |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
10 # This is hidden black magic that you need to know about to override it. |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
11 # It appears to call the method for all of the content within the brackets. |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
12 curlyBrackets := method( |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
13 map := Map clone |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
14 call message arguments foreach(arg, |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
15 map doMessage(arg) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
16 ) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
17 map |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
18 ) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
19 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
20 Map atPutThing := method( |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
21 self atPut( |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
22 call evalArgAt(0) asMutable removePrefix("\"") removeSuffix("\""), |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
23 call evalArgAt(1) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
24 ) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
25 ) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
26 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
27 the_string := "{ |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
28 \"foo\": \"12345\", |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
29 \"bar\": \"7890\" |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
30 }" |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
31 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
32 phoneNumbers := doString(the_string) |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
33 phoneNumbers keys println |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
34 phoneNumbers values println |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
35 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
36 # But presumably this will break, because there's no "atPutThing" method |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
37 a := 1 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
38 b := 5 |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
39 range := a : b |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
40 # Yep - "Exception: Number does not respond to ':'" |
d2764720ea17
Add the Day 3 'Domain Specific Language'
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
41 # So you've got to be careful for reusable operators |