【问题标题】:trouble implementing eql and equals in clisp在 clisp 中实现 eql 和 equals 的麻烦
【发布时间】:2018-03-18 04:15:04
【问题描述】:

所以我的示例代码如下:

(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 个小时尝试了此代码的几种不同变体,但都没有奏效。任何帮助将不胜感激。

【问题讨论】:

  • 既然标题说“难以实现 eql 和 equals”,你在哪里实现 eqlequals
  • eql 在此语句中使用:(if (eql (subseq response 0 2) 'Is)。我还尝试在此语句中使用 equals 而不是 eql。所以 eql 被明确使用,我在标题中包含了 equals 以传达我已经尝试过 equals 的事实。
  • 但是您并没有尝试实施其中任何一个,例如。 (defun equal (a b)...)。您正在尝试使用它们。标题令人困惑。

标签: lisp common-lisp clisp


【解决方案1】:

你可能想要的是

(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

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多