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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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