下面是我的示例代码:

(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/

10-11 04:31