在clisp中实现eql和equals的麻烦

时间:2018-03-18 04:15:05

标签: lisp common-lisp 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")
))  

基本前提是确定问题是否以“是”开头。 我认为给我带来问题的那一行是(如果(eql(subseq response 0 2)'是)。我有其他使用eql的程序,但由于某种原因,无论输入如何,这种用法总是返回false。我已经花了3个小时尝试了这段代码的几个不同变体,但没有一个有效。任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

你可能想要的是

(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