Common Lisp中的字符串比较

时间:2016-04-08 23:41:32

标签: functional-programming lisp common-lisp

我是Common Lisp和Functional编程的新手。我有一个函数让我们调用它" wordToNumber",我希望它检查输入字符串是否是"一个" " 2" "仅限三个" ..等(0-9)。我想返回1 2 3等所以(wordToNumber" one")应该输出数字1.我在使用eq和eql时遇到了一些麻烦,但是它没有工作,从我读到的是比较内存位置而不是实际字符串。有没有更容易的方法来解决这个问题,或者有什么方法来比较字符串。我需要任何示例纯函数编程,没有循环和东西。这是我在上学的一个项目的一小部分。

哦,对于字符串比较,我现在只使用一个简单的函数:

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

并用它调用它:(wordToNumber" one") 继续得到Nil返回

感谢您的帮助

3 个答案:

答案 0 :(得分:6)

比较字符串的函数是string= and string-equal,具体取决于您是否希望比较区分大小写。

当你想比较一个变量的值时,你不能引用它,因为引用的目的是为了防止评估。

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

答案 1 :(得分:1)

实际上,在制作十分支条件之前,请考虑以下事项:您可以将string=string-equal(以及任何其他二元函数)作为:test参数传递给大多数序列函数。看一下序列的功能,看看是否有与此问题相关的东西。 http://l1sp.org/cl/17.3(完全有!)

答案 2 :(得分:0)

关于Lisp的一个好处是apropos功能。 Lisp是一种很大的语言,通常有你想要的东西,而且(apropos" string")会很有用。我还推荐Lisp Hyperpec:http://www.lispworks.com/documentation/HyperSpec/Front/

eq适用于符号,CLOS对象甚至是cons单元格,但要小心:( eq(list 1)(list 1))为false,因为每个列表形式返回指向相同数字的不同cons。

eql适用于数字和字符以及eq可以处理的任何内容。一个好处是(eql x 42)即使x不是数字也能工作,在这种情况下(= x 42)不会很好。

列表和数组需要相等,字符串是数组,因此您可以使用它。然后是等于,我将作为练习留下。