[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

ERB as a macro pre-processor?

Rich Morin

10/11/2006 5:41:00 AM

"The Ruby Way" (pp. 43-45) shows a couple of different ways
to generate methods dynamically (using eval). Looking at the
examples, I began to wonder about different Ways To Do It.

One possibility that occurred to me is to use ERB as a macro
pre-processor. The book suggests the following code:

if platform == Windows
def my_action
action1
end
if platform == Linux
def my_action
action2
end
else
def my_action
default_action
end
end

Although this is approach is direct and simple, it seems like it
wouldn't scale very well, given multiple variations. However, I
think that the following approach might:


% cat erb_ml
#!/usr/bin/env ruby

require 'erb'

def action_D; print "default action\n"; end
def action_L; print "Linux action\n"; end
def action_W; print "Windows action\n"; end

action = { :Linux => 'action_L',
:Windows => 'action_W' }

template = ERB.new <<-EOF
def my_action
<%= action[platform] || 'action_D' %>
end
EOF

for platform in [ :Linux, :Windows, :Plan9 ] do
eval template.result(binding)
print "#{platform.to_s}: "
my_action
end

% erb_ml
Linux: Linux action
Windows: Windows action
Plan9: default action


Obviously, the "action" hash could be replaced by other
code-generation and/or -retrieval methods. Is anyone
here using ERB in this manner? Are there any caveats
or alternative approaches that I should be aware of?

-r
--
http://www.cf... Rich Morin
http://www.cf.../resume rdm@cfcl.com
http://www.cf.../weblog +1 650-873-7841

Technical editing and writing, programming, and web development

3 Answers

Logan Capaldo

10/11/2006 2:05:00 PM

0

On Wed, Oct 11, 2006 at 02:40:58PM +0900, Rich Morin wrote:
> "The Ruby Way" (pp. 43-45) shows a couple of different ways
> to generate methods dynamically (using eval). Looking at the
> examples, I began to wonder about different Ways To Do It.
>
> One possibility that occurred to me is to use ERB as a macro
> pre-processor. The book suggests the following code:
>
> if platform == Windows
> def my_action
> action1
> end
> if platform == Linux
> def my_action
> action2
> end
> else
> def my_action
> default_action
> end
> end
>
> Although this is approach is direct and simple, it seems like it
> wouldn't scale very well, given multiple variations. However, I
> think that the following approach might:
>
>
> % cat erb_ml
> #!/usr/bin/env ruby
>
> require 'erb'
>
> def action_D; print "default action\n"; end
> def action_L; print "Linux action\n"; end
> def action_W; print "Windows action\n"; end
>
> action = { :Linux => 'action_L',
> :Windows => 'action_W' }
>
> template = ERB.new <<-EOF
> def my_action
> <%= action[platform] || 'action_D' %>
> end
> EOF
>
> for platform in [ :Linux, :Windows, :Plan9 ] do
> eval template.result(binding)
> print "#{platform.to_s}: "
> my_action
> end
>
> % erb_ml
> Linux: Linux action
> Windows: Windows action
> Plan9: default action
>
>
> Obviously, the "action" hash could be replaced by other
> code-generation and/or -retrieval methods. Is anyone
> here using ERB in this manner? Are there any caveats
> or alternative approaches that I should be aware of?
Bah I say! How does that saying go, "Replace conditionals with
polymorphism"?

class Platform
end

class Linux < Platform
def define_methods
def a
puts "linux"
end
end
end

class Windows < Platform
def define_methods
def a
puts "windows"
end
end
end

class Platform
def self.get_platform
case RUBY_PLATFORM
when /linux/
Linux
when /win32/
Windows
end
end
end

platform = Platform.get_platform.new
platform.define_methods



Ara.T.Howard

10/11/2006 2:36:00 PM

0

Rich Morin

10/11/2006 3:53:00 PM

0

At 11:36 PM +0900 10/11/06, ara.t.howard@noaa.gov wrote:
> i did quite a bit more work on it but never released...

interesting stuff; why not put out a WIP snapshot?

Both r4 and ERB allow the use of arbitrary Ruby code. It
would be interesting to see which features of each work
better for what kinds of problems.

-r
--
http://www.cf... Rich Morin
http://www.cf.../resume rdm@cfcl.com
http://www.cf.../weblog +1 650-873-7841

Technical editing and writing, programming, and web development