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