首页 文章

Common Lisp中的等于运算符

提问于
浏览
4

为什么这样:

(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 适用于所有序列 .

2 回答

  • 13

    你总能找到它自己 . 如果您使用交互式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
    
  • 15

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

    例如:

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

    另一种方法是强制 x 为字符串:

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

相关问题