下面是我的示例代码:
(defvar answer 0)
(defvar response "")
(defun question ()
(write-line "Enter your question")
(setq response (read-line))
(if (eql (subseq response 0 2) 'Is)
(print "T")
(print "nil")
))
基本前提是确定问题是否以“是”开头。
我认为给我带来问题的那一行是(if(eql(subseq response 0 2)’is)我有其他使用eql的程序,但是出于某种原因,无论输入什么,这个使用总是返回false我已经花了3个小时尝试了这段代码的几种不同的变体,但都没有成功任何帮助都将不胜感激。
最佳答案
你可能想要的是
(string-equal (subseq response 0 2) 'Is)
string-equal
比较忽略字符大小写的字符串与string-equal
不同,string=
函数比较字符大小写的字符串使用string=
函数的等效方法是(string= (string-upcase (subseq response 0 2)) 'Is)
与字符串比较谓词相反,
eql
谓词比较lisp对象对于编译代码中的等常量字符串,它可能会返回true,而在您的情况下,如果一个对象被引用为文字,而另一个对象是计算字符串,则它将失败。例如,
(eql 'is 'is)
在解释代码中返回true,而(eql "is" "is")
在解释代码中为false。关于lisp - 实现lisp中的equals和equals遇到麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49344424/