def process_args(exp)
args = []
until exp.empty? do
arg = exp.shift
case arg
when Symbol then
args << arg
when Array then
case arg.first
when :block then
asgns = {}
arg[1..-1].each do |lasgn|
asgns[lasgn[1]] = process(lasgn)
end
args.each_with_index do |name, index|
args[index] = asgns[name] if asgns.has_key? name
end
when :block_arg then
args << "&#{arg.last}"
else
raise "unknown arg type #{arg.first.inspect}"
end
else
raise "unknown arg type #{arg.inspect}"
end
end
return "(#{args.join ', '})"
end