【问题标题】:equal Operator in Common LispCommon Lisp 中的相等运算符
【发布时间】:2013-07-03 02:52:59
【问题描述】:

为什么会这样:

(every (lambda (x) (equal "a" x)) "aaaaa")

还有这个:

(every (lambda (x) (equal "a" x)) "a")

返回NIL,此时:

(every (lambda (x) (equal "a" x)) '("a" "a" "a" "a"))

返回T?我认为every 可以处理所有序列。

【问题讨论】:

  • `(,pedant 它是一个函数而不是一个运算符)
  • @d11wtq 你能解释一下吗?
  • lisp 没有“操作符”,它只有函数。当您执行(equal x y) 时,您将equal 函数应用于xy

标签: lisp common-lisp equality


【解决方案1】:

您总是可以自己找出答案。如果您使用交互式 Lisp 系统,则只需几秒钟即可完成测试:

CL-USER 1 > (every (lambda (x) (equal "a" x)) "a")
NIL

以上返回 NIL。

现在使用 Common Lisp 函数 DESCRIBE 来获取描述的数据。

CL-USER 2 > (every (lambda (x)
                     (describe x)
                     (describe "a")
                     (equal "a" x))
                   "a")

#\a is a CHARACTER
Name                "Latin-Small-Letter-A"
Code                97
Bits                0
Font                0
Function-Key-P      NIL

所以x 的值是一个字符。角色#\a

"a" is a SIMPLE-BASE-STRING
0      #\a
NIL

“a”的类型是SIMPLE-BASE-STRING(在 LispWorks 中)。

如果你看EQUAL的定义,你会发现一个字符和一个字符串永远不相等,因为它们是不同的类型。

CL-USER 3 > (equal #\a "a")
NIL

【讨论】:

    【解决方案2】:

    因为在案例 1 和案例 2 中您比较 "a"#\a,但在最后一种情况下您比较 "a""a"。字符串的元素是字符,而不是其他字符串。

    例如:

    (every (lambda (x) (equal #\a x)) "aaaaa")
    => T
    

    另一种选择是将x 强制转换为字符串:

    (every (lambda (x) (equal "a" (string x))) "aaaaa")
    

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2011-05-24
      相关资源
      最近更新 更多