On Nov 25, 12:42 pm, Robert Klemme <shortcut... / googlemail.com> wrote:
> On 25.11.2007 19:36, Phrogz wrote:
>
>
>
> > One of my libraries previously required code like this:
>
> >   # Convert markup to HTML, doing something
> >   # useless with links and commands
> >   owl = OWLScribble.new( markup )
> >   owl.wiki_links.each{ |link|
> >     # do something useful to the link
> >   }
> >   owl.wiki_commands.each{ |command|
> >     # do something useful with the command
> >   }
> >   html = owl.to_html
>
> > I have changed it so that the user can instead describe how to handle
> > links and commands in general, so that during initialization the
> > library doesn't waste time or code lines doing something useless:
>
> >   owl = OWLScribble.new( markup ) do |owl|
> >     owl.handle_wiki_link do |tag, page, link_text|
> >       # do something useful to the link
> >     end
> >     owl.handle_wiki_command do |tag, command, params|
> >       # do something useful to the command
> >     end
> >   end
> >   puts owl.to_html
>
> > The syntax you see above is my current favorite choice for specifying
> > these two procs. Alternatives that I have rejected as less elegant:
>
> >   # Deferred initialization
> >   owl = OWLScribble.new( markup )
> >   owl.handle_wiki_link{ ... }
> >   owl.handle_wiki_command{ ... }
> >   owl.run
> >   puts owl.to_html
>
> >   # proc params
> >   do_link = proc{ ... }
> >   do_command = proc{ ... }
> >   owl = OWLScribble.new(
> >     markup,
> >     :handle_wiki_link=>do_link,
> >     :handle_wiki_command=>do_command
> >   )
> >   puts owl.to_html
>
> > Can anyone suggest a more elegant way of supplying multiple processing
> > procs that should be used during initialization, on a per-instance
> > basis?
>
> Why not just
>
>    owl = OWLScribble.new(
>      markup,
>      :handle_wiki_link => lambda {...},
>      :handle_wiki_command => lambda {...}
>    )

I personally lump that in with the other option that happens to create
the procs outside the function call. As you show it, with a single
ellipsis for each proc's content, it feels clean. I expect
handle_wiki_link to be on the order of 20 lines, and
handle_wiki_command to take 50-100 lines. That seems excessive to
inline into a method call.