_Why Yown Is Funny So You Can Laugh Too
discoveringio.blogspot.com
discoveringio.blogspot.com
ref: "Lazy Bricks, Lazy Mortar" by why - WayBackMachine link: http://web.archive.org/web/20080430135919/http://hackety.org...
Hash := Object clone do (
with := method (
hash := Map clone
call message arguments foreach (arg,
# arg = k(v) for eg. t(0)
k := arg name
v := arg argAt(0) asString
hash atPut (k, doString (v))
)
hash
)
)
h := Hash with (t(0), f(1+1), with("hello"), writeln("not writeln!"))
h2 := Hash with (t(100), f("hello" asUppercase), at("my at"), atPut("my atPut"))
Above lazily goes through the Hash with() building the key/value pairs without ever running methods/functions with, writeln, at, atPut and simply takes the method/func name and evaluates its argument into a key/value pair: h at ("writeln") println # => "not writeln!"
h at ("f") println # => 2
h2 at ("f") println # => "HELLO"
This is the reflection alternative the author is referring to in his post.I think Yown got me more interested in playing with Io than anything else. However the Builder is limited (because everything gets converted to a html tag). There are more complete HTML builders for Io on github.
Bruce Tate also provides a nice example of a HTML builder in *Seven languages in 7 weeks". Below is my slightly amended version of it:
Builder := Object clone
Builder forward := method (
write ("<", call message name, ">")
call message arguments foreach (arg,
content := self doMessage (arg);
if (content type == "Sequence" or content type == "Number", write(content))
)
write ("</", call message name, ">")
)
Builder do (
html (
h1 ("header")
div (
p ("paragraph", b ("bold"), "more text")
ul (list(1,2,3) foreach (n, li (n)))
)
)
)Seems like Io's "forward" is a lot like "did-not-understand" (and similar mechanisms in Ruby/etc. languages), but it takes priority over messages that would've otherwise been understood.
Mine (in perl) is more akin to Ruby's Builder by Jim Weirich (http://builder.rubyforge.org/) than out and out HTML builder.
BTW, other HTML builders have been mentioned on HN before: http://news.ycombinator.com/item?id=1518096
Yes its same as did-not-understand/method_missing/__getattr__/AUTOLOAD but no it doesn't take priority over other defined messages.
For eg, If I change the first line in my code above to:
Builder := Object do (
foo := method (arg, write (arg))
)
And do: Builder do (
h1 (
foo ("Foo here!")
p ("paragraph")
)
)
I get a untagged "Foo Here!": <h1>Foo here!<p>paragraph</p></h1>Actually, the article seems to be wrong? It seems to imply that this shouldn't work:
Io> x := Object clone do( forward := 0; a := 1 )
==> Object_0x1003a2e90:
a = 1
forward = 0
Io> x a
==> 1
Io> x b
==> 0
Io> x b := 2
==> 2
Io> x b
==> 2
(paragraph: There are some things you should know about forward(). It's very powerful. Too powerful. [...])The documentation clearly states for forward that: If an object doesn't respond to a message, it will invoke its "forward" method if it has one.