Lisp案例具有不同的等式谓词

Kot*_*pou 1 equality predicate common-lisp

作为Tic Tac Toe玩机器人的一部分,我需要一个功能来评估瓷砖与点的组合.代码看起来像这样:

(case combination
    ("EEEEE" 0)
    ("EEEEP" 1)
    ("EEEPE" 1)
    ("EEEPP" 2)
    ("EEPEE" 1)
    ("EEPEP" 2)
    ("EEPPE" 2)
    ("EEPPP" 3)
    ("EPEEE" 1)
    ("EPEEP" 2)
    ("EPEPE" 2)
    ("EPEPP" 3)
    ("EPPEE" 2)
    ("EPPEP" 3)
    ("EPPPE" 3)
    ("EPPPP" 4)
    ("PEEEE" 1)
    ("PEEEP" 2)
    ("PEEPE" 2)
    ("PEEPP" 3)
    ("PEPEE" 2)
    ("PEPEP" 3)
    ("PEPPE" 3)
    ("PEPPP" 4)
    ("PPEEE" 2)
    ("PPEEP" 3)
    ("PPEPE" 3)
    ("PPEPP" 4)
    ("PPPEE" 3)
    ("PPPEP" 4)
    ("PPPPE" 4)
    ("PPPPP" 5))
Run Code Online (Sandbox Code Playgroud)

(这不是讨论这种方法的价值的地方,因为它被用于与问题无关的原因)

问题是case使用的谓词对于不是同一个对象的相同字符串不返回true(如果是eq或eql则很难找到).你怎么能改变它?

编辑:我通过将字符串转换为相应的二进制数来解决原始问题,可以使用eql进行比较或用作列表中的索引.

Sva*_*nte 7

使用alexandria:switchalexandria库从quicklisp,可用.

(switch (combination :test #'string=)
  ("FOO" …)
  …)
Run Code Online (Sandbox Code Playgroud)