我是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返回
感谢您的帮助
答案 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)不会很好。
列表和数组需要相等,字符串是数组,因此您可以使用它。然后是等于,我将作为练习留下。