Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Common Lisp - type checking two variables

Hi I'm a beginner in Common Lisp. I want to check if two variables are integers. If both n and m are integers I want to it to return - if it is negative, 0 if it is zero, + if it is positive and NIL if it is not an integer for both n and m. I figured out how to do this with one variable but I can't seem to figure out how to do it with two variables. Thanks.

This is the code that takes a numeric argument and returns - if it is negative, 0 if it is zero, + if it is positive and NIL if its not an integer:

(defun sign (n)
 (if(typep n 'integer)
    (cond ((< n 0) '-)
          ((= n 0) 0)
          ((> n 0) '+))))

The output for each case is:

CL-USER> (sign 3) 

+

CL-USER> (sign -3) 

-

CL-USER> (sign 0) 

0

CL-USER> (sign 3.3)

NIL

This is the code I have for checking two variables which I want it to check if n and m are integers and if n and m are positive, negative or a zero:

(defun sign (n m)
 (if (and (typep n 'integer) (typep m 'integer))
  (cond (and ((< n 0) '-) ((< m 0) '-))
        (and ((= n 0) 0) ((= m 0) 0))
        (and ((> n 0) '+) ((> m 0) '+)) ))))
like image 837
Mr.Money Avatar asked Oct 04 '18 00:10

Mr.Money


1 Answers

Remember basic Lisp syntax. Function calls and some basic expressions are written as

(operator argument-0 argument-1 ... argument-n)

Right?

open parenthesis, operator, argument-0 argument-1 ... argument-n, closing parenthesis.

Now if we have (< n 0) and (< m 0) how would an AND expressions look like?

(and (< n 0) (< m 0))

But you write:

and ((< n 0) '-) ((< m 0) '-)

You have these mistakes:

  • no parentheses around the AND expression.
  • extra parenthesis around the argument expressions.
  • '- mixed into the argument expressions.

Now COND expects:

(COND (testa1 forma0 forma1 ... forman)
      (testb1 formb1 formb1 ... formbn)
      ...
      (testm1 formm0 formm1 ... formmn))

So instead of

(defun sign (n m)
  (if (and (typep n 'integer) (typep m 'integer))
      (cond (and ((< n 0) '-) ((< m 0) '-))
            (and ((= n 0)  0) ((= m 0)  0))
            (and ((> n 0) '+) ((> m 0) '+)))))

Btw, there was an extra parenthesis at the end.

We write:

(defun sign (n m)
  (if (and (typep n 'integer) (typep m 'integer))
      (cond ((and (< n 0) (< m 0)) '-)
            .... )))

It's also possible to use predicates like integerp, minusp, zerop and plusp.

like image 200
Rainer Joswig Avatar answered Oct 15 '22 09:10

Rainer Joswig