# LISP to Ruby translation

**URL:** <https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315>\
**Category:** Ruby\
**Created:** [December 15, 2005, 3:36am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315 "2005-12-15T03:36:58Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 15, 2005, 3:36am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/1 "2005-12-15T03:36:58Z")

</div>

Jut a quick one, how do you translate this:

((if (zero? 0) + -) 3 4)  
=\> 7

to Ruby?

Cheers,  
Douglas

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 15, 2005, 3:46am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/2 "2005-12-15T03:46:03Z")

</div>

Douglas L. wrote:

> Jut a quick one, how do you translate this:
> 
> ((if (zero? 0) + -) 3 4)  
> =\> 7
> 
> to Ruby?
> 
> Cheers,  
> Douglas

3.send(x.zero? ? :+ : :-, 4)

It’s a little hard to read with all those colons. Maybe this is better:

3.send(if x.zero? then :+ else :- end, 4)

Or you could replace symbols with strings for readability, at a cost to  
speed:

p 3.send(x.zero? ? “+” : “-”, 4)

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 15, 2005, 3:49am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/3 "2005-12-15T03:49:04Z")

</div>

Douglas L. wrote:

> Jut a quick one, how do you translate this:
> 
> ((if (zero? 0) + -) 3 4)  
> =\> 7
> 
> to Ruby?

Well, these kind of questions are rarely helpful; translating an  
idiomatic expression out of context from one language is often useless,  
because in a greater context the ruby code might be doing something  
completely different to begin with.

But, if you want a one-liner…

3.method(0.zero? ? :+ : :-).call(4)

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

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

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 15, 2005, 11:24pm UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/4 "2005-12-15T23:24:56Z")

</div>

Douglas L. wrote:

> Just a quick one, how do you translate this:
> 
> ((if (zero? 0) + -) 3 4)

What dialect of LISP is that? Not Common… CL has no “zero?”  
(it’s “zerop”), and + and - refer to input history rather than the  
functions  
associated with the operators. To do something like that in CL I think  
you have to use the characters '+ and '- and an (eval)…

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 15, 2005, 11:40pm UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/5 "2005-12-15T23:40:07Z")

</div>

On Fri, Dec 16, 2005 at 07:22:39AM +0900, Mark J.Reed wrote:

> Douglas L. wrote:
> 
> > Just a quick one, how do you translate this:
> > 
> > ((if (zero? 0) + -) 3 4)
> 
> What dialect of LISP is that? Not Common… CL has no “zero?”

It’s Scheme. A much nicer dialect than CL, IMHO. 😉

I think in CL the equivalent would be:

((if (zerop 0) #’+ #’-) 3 4)

Note the ugly sharp-quotes, due to the fact that CL has separate  
namespaces for values and functions.

regards,  
Ed

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 16, 2005, 8:27am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/6 "2005-12-16T08:27:37Z")

</div>

Stephen W. wrote:

> –Steve

7

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 16, 2005, 8:12am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/7 "2005-12-16T08:12:35Z")

</div>

On Dec 14, 2005, at 6:36 PM, Douglas L. wrote:

> ((if (zero? 0) + -) 3 4)  
> =\> 7
> 
> to Ruby?

7 if true

–Steve

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 17, 2005, 12:31am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/8 "2005-12-17T00:31:47Z")

</div>

Edward F. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> I think in CL the equivalent would be:
> 
> ((if (zerop 0) #‘+ #’-) 3 4)

No, you need:

(apply (if (zerop 0) #‘+ #’-) '(3 4))

> Note the ugly sharp-quotes, due to the fact that CL has separate  
> namespaces for values and functions.

And that is why. 🙂

---

<div class="post-metadata">

**Author:** ![dlewan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/eb9ed0/32.png) [@dlewan](https://www.ruby-forum.com/u/dlewan)\
**Post date:** [December 16, 2005, 11:04am UTC](https://www.ruby-forum.com/t/lisp-to-ruby-translation/50315/9 "2005-12-16T11:04:17Z")

</div>

Joel VanderWerf [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 7 if true
> > 
> > –Steve
> 
> 7

There - who says ruby isn’t concise!

martin
