【问题标题】:LISP - Make new unique symbolLISP - 制作新的独特符号
【发布时间】:2016-02-11 21:31:06
【问题描述】:

在一个 Common Lisp 程序中,我想找到一种方法来生成一个当时程序中没有使用的新符号。我知道 (gensym) 函数,但这会使程序中可能已经存在的符号。我知道我需要实习符号,所以我尝试了这个:

(defun new-symbol () (intern (symbol-name (gensym))))

这似乎得到了一半的答案。例如,

[1]> (new-symbol)
G3069
NIL
[2]> (new-symbol)
G3070
NIL
[3]> (defvar a 'G3071)
A
[4]> (new-symbol)
G3071
:INTERNAL

如您所见,该函数似乎识别出符号“G3071”已在其他地方使用,但如果是这种情况,我不知道如何让它生成一个新符号。

【问题讨论】:

    标签: common-lisp symbols


    【解决方案1】:

    我知道 (gensym) 函数,但这会生成程序中可能已经存在的符号。

    不,它没有。它创建的符号不包含在任何包中。文档说(强调):

    Function GENSYM

    语法:

    gensym &optional x ⇒新符号

    参数和值:

    x——字符串或非负整数。复杂的违约 行为;见下文。

    new-symbol——一个新鲜的、无拘无束的符号。

    您还可以使用make-symbol 创建一个未在任何包中实习的符号。它是文档摘要(与 gensym 的几乎相同):

    Function MAKE-SYMBOL

    语法:

    make-符号名称 ⇒新符号

    参数和值:

    名称——一个字符串。

    new-symbol——一个新鲜的、无拘无束的符号。

    关于你的第二点:

    我有点理解我需要实习符号,所以我尝试了这个:

    不,如果你想要一个新鲜的符号,那么你可能不想想在任何地方实习。实习是您获取字符串(不是符号)并在特定包中获取具有给定名称的符号的过程。如果您使用相同的符号名称调用 intern 并两次打包,您将返回 相同的符号,这是您要避免的。

    CL-USER> (defparameter *a* (intern "A"))
    *A*
    CL-USER> (eq *a* (intern "A"))
    T
    

    由于 gensym 使用 *gensym-counter* 生成新符号的名称,如果您从 gensym 符号中获取名称并在某个地方实习,如果有人修改了 *gensym-counter* 的值,你可能会得到相同的符号。例如:

    (let ((counter *gensym-counter*)    ; save counter value
          (s1 (gensym)))                ; create a gensym (s1)
      (setf *gensym-counter* counter)   ; reset counter value
      (let ((s2 (gensym)))              ; create a gensym (s2)
        (list s1                        
              s2            
              (eq s1 s2)
              (symbol-name s1) 
              (symbol-name s2)
              (string= (symbol-name s1)
                       (symbol-name s2)))))
    
    ; (#:G1037 #:G1037 NIL      ; different symbols
    ;  "G1037" "G1037" T)       ; same name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多