# Re: LISP to Ruby translation

**URL:** <https://www.ruby-forum.com/t/re-lisp-to-ruby-translation/50317>\
**Category:** Ruby\
**Created:** [December 15, 2005, 4:01am UTC](https://www.ruby-forum.com/t/re-lisp-to-ruby-translation/50317 "2005-12-15T04:01:05Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Neville\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/ea666f/32.png) [@Neville\_B](https://www.ruby-forum.com/u/Neville_B)\
**Post date:** [December 15, 2005, 4:01am UTC](https://www.ruby-forum.com/t/re-lisp-to-ruby-translation/50317/1 "2005-12-15T04:01:05Z")

</div>

I think that’s the first time I have seen an emoticon in ruby code

🙂

---

<div class="post-metadata">

**Author:** ![Neville\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/ea666f/32.png) [@Neville\_B](https://www.ruby-forum.com/u/Neville_B)\
**Post date:** [December 15, 2005, 4:04am UTC](https://www.ruby-forum.com/t/re-lisp-to-ruby-translation/50317/2 "2005-12-15T04:04:06Z")

</div>

Neville B. wrote:

> I think that’s the first time I have seen an emoticon in ruby code
> 
> 🙂

## Oh wow, you’re right. I need to fit that into some real code sometime, heh. Well, not really, since I abhor such one-liners outside of demonstrations, but it’d be nice…

Neil S. - removed\_email\_address@domain.invalid

‘A republic, if you can keep it.’ – Benjamin Franklin

---

<div class="post-metadata">

**Author:** ![Neville\_B](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/ea666f/32.png) [@Neville\_B](https://www.ruby-forum.com/u/Neville_B)\
**Post date:** [December 15, 2005, 3:57pm UTC](https://www.ruby-forum.com/t/re-lisp-to-ruby-translation/50317/3 "2005-12-15T15:57:07Z")

</div>

# A bit of fun to while away a boring afternoon

class Fixnum  
def prev  
self - 1  
end  
end

def add a, b  
return a if b.zero?  
if b \> 0  
add a.succ, b.prev  
else  
add a.prev, b.succ  
end  
end

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])
