Mercurial > repos > other > SevenLanguagesInSevenWeeks
annotate 2-Io/day2-reflection.io @ 93:39084e2b8744
Add a function for word-aware text wrapping
Potentially hugely inefficient because we iterate through the
string character by character, but then splitting it first and
iterating over words still needs to iterate over the string to
know where to split.
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Tue, 18 Jun 2019 21:05:00 +0100 |
parents | e8407d4e72dd |
children |
rev | line source |
---|---|
38
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
1 # Reflection in Io is about working out what goes on in slots |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
2 # We're now going to create an "ancestors" method that we needed |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
3 # on day 1 to find all slots! |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
4 Object ancestors := method( |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
5 # Store our prototype |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
6 prototype := self proto |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
7 # If we're not at the top |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
8 if (prototype != Object, |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
9 # Then print the type name as a header |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
10 writeln("Slots of ", prototype type,"\n--------------------") |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
11 # And iterate the slots with foreach() before printing with writeln() |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
12 # TODO: Find the difference between println and writeln, other than "message vs function" |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
13 prototype slotNames foreach(slotName, writeln(slotName)) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
14 # Blank line |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
15 writeln |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
16 # Recurse! |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
17 prototype ancestors |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
18 ) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
19 ) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
20 |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
21 Animal := Object clone |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
22 Animal speak := method("*ambiguous animal noise" println) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
23 Duck := Animal clone |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
24 Duck speak := method("Quack-quack!" println) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
25 Duck walk := method("waddle" println) |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
26 donald := Duck clone |
e8407d4e72dd
Add code on reflection - basically involves the object returned by "proto" message
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
27 donald ancestors |