user1726845
user1726845

Reputation: 119

String Comparison in Common Lisp

I am new to Common Lisp and Functional programming in general. I have a function lets call it "wordToNumber", I want it to check if the input string is "one" "two" "three".. etc (0-9) only. and I want to return 1 2 3 etc. so (wordToNumber "one") should output the number 1. I'm having some trouble with string comparison, tried using eq and eql, but its not working, from what I read it is comparing memory location not actual string. Is there an easier way to go about this or is there someway to compare strings. I need any examples to be purely functional programming, no loops and stuff. This is a small portion of a project I'm working on for school.

Oh, for string comparison im just using a simple function at the moment like this:

(defun wordToNumber(x)
     (if(eq 'x "one")(return-from wordToNumber 1)))

and calling it with this : (wordToNumber "one") keep getting Nil returned

Thanks for any help

Upvotes: 1

Views: 7270

Answers (3)

wobh
wobh

Reputation: 101

As a practical matter, before you make a ten-branch conditional, consider this: you can pass string= and string-equal (and any other binary function) as an :test argument to most of the sequence functions. Look though the sequence functions and see if there's something that seems relevant to this problem. http://l1sp.org/cl/17.3 (There totally is!)

Upvotes: 1

kennytilton
kennytilton

Reputation: 1064

One nice thing about Lisp is the apropos function. Lisp is a big language and usually has what you want, and (apropos "string") would prolly have worked for you. I recommend also the Lisp Hyperpec: http://www.lispworks.com/documentation/HyperSpec/Front/

eq is good for symbols, CLOS objects, and even cons cells but be careful: (eq (list 1) (list 1)) is false because each list form returns a different cons pointing to the same number.

eql is fine for numbers and characters and anything eq can handle. One nice thing is that (eql x 42) works even if x is not a number, in which case (= x 42) would not go well.

You need equal for lists and arrays, and strings are arrays so you could use that. Then there is equalp, which I will leave as an exercise.

Upvotes: -1

Barmar
Barmar

Reputation: 780798

The functions to compare strings are string= and string-equal, depending on whether you want the comparison to be case-sensitive.

And when you want to compare the value of a variable, you mustn't quote it, since the purpose of quoting is to prevent evaluation.

(defun word-to-number (x)
    (cond ((string-equal x "one") 1)
          ((string-equal x "two") 2)
          ((string-equal x "three") 3)
          ...
          ))

Upvotes: 8

Related Questions