Page 1 of 1

absolute value conditional

Posted: Sun Oct 16, 2011 8:12 am
by sycamorex
Hi,
I wrote the following 2 functions to return the absolute value of a number. They seem to work but If you could have a look and point out any mistakes in style, design, efficiency, etc.

Code: Select all

(defun absvalue (n)                                                                                       
  "Returns the absolute value of the argument"                                                            
  (if (numberp n)                                                                                         
      (if (< n 0) (- n) n)                                                                                
      'it-is-not-a-number))                                                                               
                                                                                                          
(defun absval2 (n)                                                                                        
  "An alternative version of absvalue"                                                                    
  (cond ((and (numberp n) (< n 0)) (- n))                                                                 
        ((numberp n) n)                                                                             
        ('we-need-numbers)))    
Thank you.

Re: absolute value conditional

Posted: Sun Oct 16, 2011 9:54 pm
by nuntius
When checking arguments, it is often good to signal an error early. ("throw an exception" in C++/Java)

Code: Select all

(unless (numberp n) (signal some-error))
(assert (numberp n) ...)
(check-type n number)
APIs that silently insert a failure token can be very hard to debug. Something will fail later, and you're left wondering "when did x become not-a-number?!??"

Re: absolute value conditional

Posted: Tue Oct 18, 2011 3:13 pm
by sycamorex
Thanks a lot for your feedback.