changeset 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 54608c26bda2
children 6347bacb3be7
files 2-Io/day3-DSL.io
diffstat 1 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2-Io/day3-DSL.io	Mon Sep 18 20:45:32 2017 +0100
@@ -0,0 +1,41 @@
+# Creating a simple "domain-specific language"
+# (Except it's not really - it's just a little extension to support
+# the "{ key:value[, key:value[…]] }" format of specifying dictionaries)
+
+# Because this is a string then we can do it at any time!
+OperatorTable addAssignOperator(":", "atPutThing")
+
+# curlyBrackets is an automatically invoked function from the parser whenever
+# it encounters curly brackets.
+# This is hidden black magic that you need to know about to override it.
+# It appears to call the method for all of the content within the brackets.
+curlyBrackets := method(
+    map := Map clone
+    call message arguments foreach(arg,
+        map doMessage(arg)
+    )
+    map
+)
+
+Map atPutThing := method(
+    self atPut(
+        call evalArgAt(0) asMutable removePrefix("\"") removeSuffix("\""),
+        call evalArgAt(1)
+    )
+)
+
+the_string := "{
+    \"foo\": \"12345\",
+    \"bar\": \"7890\"
+}"
+
+phoneNumbers := doString(the_string)
+phoneNumbers keys println
+phoneNumbers values println
+
+# But presumably this will break, because there's no "atPutThing" method
+a := 1
+b := 5
+range :=  a : b
+# Yep - "Exception: Number does not respond to ':'"
+# So you've got to be careful for reusable operators
\ No newline at end of file