【问题标题】:Howto recreate a symbol created by `make-symbol`如何创建由“男性符号”创建的符号
【发布时间】:2018-09-19 15:31:37
【问题描述】:

我的程序创建了虚拟数据。这些虚拟数据的一部分是符号形式的键:(lambda (i) (make-symbol(format nil"~@r"i)))(以罗马数字作为键的固定数字值)。该程序将这些虚拟键值对存储在我正在开发的数据结构中。

我尝试使用 REPL 中的这些符号来测试通过它们的键检索值。然而:

(equal (make-symbol "IX") (make-symbol "IX"))

(equal (make-symbol "IX") 'IX))

有没有办法在 REPL 中输入先前使用 make-symbol 创建的符号,以便两者都是 equal

【问题讨论】:

  • 我可以通过使用其他类型(例如字符串)而不是符号作为键来解决测试中的问题。我仍然想知道如何引用make-symbol 和朋友生成的符号。
  • 这不是intern应该做的吗?
  • stackoverflow.com/questions/8359304/…关于uninterned symbol(例如make-symbol创建的那些)

标签: common-lisp


【解决方案1】:

正如@coredump 所建议的,使用实习生将这些符号添加到某个包中,如下所示:

CL-USER> (defpackage :my-symbols)
#<Package "MY-SYMBOLS">
CL-USER> (intern "IX" :my-symbols)
MY-SYMBOLS::IX
NIL
CL-USER> (intern "IX" :my-symbols)
MY-SYMBOLS::IX
:INTERNAL
CL-USER> (eql (intern "IX" :my-symbols)
              (intern "IX" :my-symbols))
T
CL-USER>

【讨论】:

    【解决方案2】:

    可以使用string=按名称比较符号:

    CL-USER 29 > (string= (make-symbol "IX") (make-symbol "IX"))
    T
    
    CL-USER 30 > (string= (make-symbol "IX") (make-symbol "Ix"))
    NIL
    

    string-equal 是不区分大小写的变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2011-11-13
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      相关资源
      最近更新 更多