公共Lisp中的非关联符号

公共Lisp中的非关联符号,lisp,common-lisp,Lisp,Common Lisp,有好几次我遇到了不可理解的符号的概念,但我并不完全清楚它们是什么 有没有一种方法可以实习用(make symbol)创建的符号? 我可以在不插入符号的情况下为符号赋值吗? 是否可以重命名符号(内部或非内部)? 一个人还可以用一个不需要的符号做什么 更新: 这段代码中的符号发生了什么变化 CL-USER> (defun func () (let ((var 'sym)) (print (find-symbol "sym"))

有好几次我遇到了不可理解的符号的概念,但我并不完全清楚它们是什么

有没有一种方法可以实习用(make symbol)创建的符号?
我可以在不插入符号的情况下为符号赋值吗?
是否可以重命名符号(内部或非内部)?
一个人还可以用一个不需要的符号做什么

更新:
这段代码中的符号发生了什么变化

CL-USER> (defun func ()
           (let ((var 'sym))
             (print (find-symbol "sym"))
             (print var)))
FUNC
CL-USER> (func)

NIL 
SYM 
SYM
我的错误理解是:
1.“查找符号”打印为零,因此该符号未被插入
2.var打印sym时不带#:在开头,这意味着它是被拘留的

  • CL-USER> (intern (string (make-symbol "TEST")))
    TEST
    :INTERNAL 
    
  • 没有

  • 没有

  • 它通常用于包声明中,以避免污染进行声明的包的名称空间(如果使用了普通符号)或关键字package,因为
    defpackage
    表单的
    :export
    :use
    子句中的条目无论如何都会转换为字符串。因此,您可以在函数中使用它,函数接受任何内容并将其转换为字符串。更一般地说,不感兴趣的符号可以作为唯一的对象使用,只有一个名称,其他什么都没有。但通常情况下,关键字符号用于此目的


  • 非预期符号主要用作名称或指示符,以避免软件包混乱,或用于相关任务

    例如:

    T1> (find-symbol "T2")
    NIL
    NIL
    T1> (find-symbol "T3")
    NIL
    NIL
    T1> (defpackage t2)
    #<Package "T2">
    T1> (defpackage #:t3)
    #<Package "T3">    
    T1> (find-symbol "T2")
    T2
    :INTERNAL
    T1> (find-symbol "T3")
    NIL
    NIL
    
    那么,答案是什么呢

    有没有办法实习用(制作符号)创建的符号

    是的:

    T1> (import (make-symbol "T4"))
    T
    T1> (find-symbol "T4")
    T4
    :INTERNAL
    
    我可以给一个符号赋值,而不需要对它进行插值吗

    是的,当您丢失可以通过其名称和Package唯一标识的属性时,您仍然可以使用其值槽、plist等:

    T1> (let ((symbol '#:t5))
          (setf (symbol-value symbol) 1)
          (setf (get symbol :foo) :bar)
          (setf (symbol-function symbol) (lambda ()))
          (values (symbol-value symbol)
                  (get symbol :foo)
                  (symbol-function symbol)))
    1
    :BAR
    #<Anonymous Function #xC829036>
    
    T1>(let((符号“#:t5))
    (setf(符号值符号)1)
    (setf(获取符号:foo):条)
    (setf(符号函数符号)(lambda())
    (值(符号值符号)
    (获取符号:foo)
    (符号功能符号)))
    1.
    :巴
    #
    
    是否可以重命名符号(内部或非内部)

    修改符号名称的后果尚未定义

    一个人还可以用一个不需要的符号做什么


    我真的认为它们主要用作包定义中的指示符,但一般的答案是:它们在不使用硬编码字符串的情况下命名事物,并且不想污染任何包的情况下非常有用。

    我理解4。但严格地说,在1。你不是在实习符号,而是用相同的名称创建一个不同的符号。还有一个问题,是否可以用相同的方式在词汇上实习/取消实习符号?我不理解这个问题。你能给出一个例子或更详细的解释吗?雷纳应该在他的评论中澄清这一点。默认情况下,符号名称是大写的。使用FIND-SYMBOL查找它们是区分大小写的。我明白了,谢谢(现在此评论足够长,可以发布了)
    T1> (let ((symbol '#:t5))
          (setf (symbol-value symbol) 1)
          (setf (get symbol :foo) :bar)
          (setf (symbol-function symbol) (lambda ()))
          (values (symbol-value symbol)
                  (get symbol :foo)
                  (symbol-function symbol)))
    1
    :BAR
    #<Anonymous Function #xC829036>