From: Ilmari Heikkinen Date: 2005-12-15T23:55:13+09:00 Subject: Re: LISP to Ruby translation # A bit of fun to while away a boring afternoon class Fixnum def prev self - 1 endend def add a, b return a if b.zero? if b > 0 add a.succ, b.prev else add a.prev, b.succ endend def leval(args) return args unless args.is_a? Array args.map!{|a| if a.is_a? Array leval a else a end } op, *args = args functions[op][args]end def functions { :if => lambda{|args| if leval(args.first) then args[1] else args[2] end }, :zero? => lambda{|args| not (args.first > 0 or args.first < 0) }, :+ => lambda{|args| args.inject{|s,i| add s, i}}, :- => lambda{|args| args.inject{|s,i| add s, -i}} }end p leval([[:if, [:zero?, 0], :+, :-], 3,4])