在 lisp 中实现 equal 和 equals 的麻烦

trouble implementing eql and equals in clisp

下面是我的示例代码:

(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")
))  

基本前提是识别所问问题是否以单词 is 开头。 我认为给我带来问题的那一行是 (if (eql (subseq response 0 2) 'Is)。我还有其他使用 eql 的程序,但出于某种原因,无论输入如何,这种使用总是返回 false。我已经花了 3 个小时尝试此代码的几个不同变体,但 none 成功了。任何帮助将不胜感激。

您可能想要的是

(string-equal (subseq response 0 2) 'Is)

string-equal 比较忽略字符大小写的字符串。与 string-equal 不同,string= 函数比较字符串时考虑字符大小写。使用 string= 函数的等价物是

(string= (string-upcase (subseq response 0 2)) 'Is)

与字符串比较谓词相反,eql 谓词比较 lisp 对象。对于编译代码中的相等常量字符串,它很可能 return true 而在您的情况下,一个对象被引用文字而另一个对象被计算为字符串,它将失败。

例如 (eql 'is 'is) returns true(eql "is" "is") 在解释代码中是 false .