symbol

symbolp函数

CL-USER> (symbolp 'aaa)                    T
CL-USER> (symbolp nil)                     T
CL-USER> (defun me ())                     ME
CL-USER> (symbolp me) me is unbound,
CL-USER> (symbolp 'me)                     T
CL-USER> (symbolp #'me)                    NIL
CL-USER> (symbolp 5)                       NIL
CL-USER> (symbolp "string")                NIL
CL-USER> (symbolp :me)                     T
CL-USER> (symbolp #\a)                     NIL
CL-USER>  (defparameter *i* 0)             *I*
CL-USER> (symbolp '*I*)                    T
CL-USER> *i*                               0
CL-USER> *I*                               0

CL-USER> (setf |hi| 7)                7
CL-USER> |hi|                         7
CL-USER> hi                           No value
CL-USER> (symbol-value '|hi|)         7
CL-USER> (symbol-value 'hi)           No value
CL-USER> (symbol-value |hi|)          No value      The value 7 is not of type SYMBOL.

下面说明|hi|与hi的区别,common lisp 应该是把symbol 譬如hi形式都转换成大写进行存储,而|hi|才能够表示原样。

MINE> (setf |hi| 7)          7
MINE> (find-symbol "hi")       说明可以找到hi这个symbol     
|hi|
:INTERNAL
MINE> (find-symbol "HI")       不能找到HI这个symbol
NIL
NIL
MINE> (setf hi 9)            9
MINE> hi                     9 读取器看到hi的话,把他按大写形式读入跟package中的映射匹配,发现HI的值就是9
MINE> |hi|                   7 读取器看到|hi|,保持原样读入,然后跟package中的映射关系匹配,发现hi的值就是7
MINE> (find-symbol "HI")       因为你setf的时候把hi先转换成HI,并且同时加入到symbol中,所以现在可以找到了。
HI
:INTERNAL
可以产生symbol的方式:SETF / SET / INTERN

CL-USER> (find-symbol "happy")
NIL
NIL
CL-USER> (set '|happy| 9)       ;;加quote的原因,如果你不加的话,他会对|happy|求值,即happy看这个symbol是否有对应的值。没有就会报unbound.
9
CL-USER> (find-symbol "happy")
|happy|
:INTERNAL
CL-USER> (find-symbol "HAPPY")
NIL
NIL
CL-USER> (intern "HAPPY")       ;;string里面是都是大写的话,将新建一个全部大写的symbol
HAPPY
NIL
CL-USER> (intern "I Have a dream")  ;;如果string里面是大小写混合的话,它所建立的symbol必须要两个竖线引起来,为的是保持原状。
|I Have a dream|
NIL
CL-USER> (find-symbol "HAPPY")
HAPPY
:INTERNAL
setf / set 的区别
首先看他们两个的用法(setf &rest args) (set symbol new-value)
setf 是引入一个变量,所以你发现他后面必须是一个可以接受值的对象,比如|hi|/hi等,而不能是'hi/:hi
CL-USER> (setf |hi| 7)          7
CL-USER> (setf hi 6)            6
CL-USER> (setf :hi 4)           no value  :HI is a constant and thus can't be set.
CL-USER> (setf 'tie 9)          no value  Undefined function: (SETF QUOTE)
CL-USER> (set thanks 1)         no value  The variable THANKS is unbound.
CL-USER> (set 'thanks 1)        1
CL-USER> thanks                 1
CL-USER> (symbol-value 'thanks) 1
其实说了这么多,究其原因还是因为common lisp中把symbol全部按照大写读入,而导致我们不能像其他语言一样,赋值给一个纯小写,或者大小写混合的symbol。所以我们就引入了双竖线来保持原样。

扩展:诸如(hello-world)这样的表达式得以调用一个特定的hello-world函数原因在于,读取器在读取对这个函数调用的时候跟定义这个函数时返回的符号一样。
它实际上在defun以后会返回一个跟函数名string-equal的符号即:HELLO-WORLD,而你在想一下我们平常调用的时候是(hello-world),按照上面的说法也就是我们调用的函数名自动转化为了大写形式,这个时候才会跟defun建立的symbol匹配,这个也正好印证我所说读取器会把字符都转化成大写,然后再跟symbol进行比较。
CL-USER> (defun hello-world()
	   (format t "hello world"))
HELLO-WORLD
CL-USER> (hello-world)
hello world
NIL
CL-USER> (|hello-world|)      no value The function COMMON-LISP-USER::|hello-world| is undefined.
CL-USER> (defun Hello-World()  ;;因为既然你在defun的时候,会创建一个把function name转化为大写的symbol,所以你这样定义会出现下面redefine形式。
	   (format t "Hello World"))
STYLE-WARNING: redefining COMMON-LISP-USER::HELLO-WORLD in DEFUN
HELLO-WORLD
CL-USER> (hello-world)
Hello World
NIL
问题:正如上面所说函数defun的时候会同样建立一个symbol,我们对于一个variable的话,可以通过(symbol-value variable)来查看他的值,这个时候如何查看一个函数所对应的存入的symbol呢?
CL-USER> (symbol-value '|hi|)           7
CL-USER> (symbol-value 'hello-world)    ; No value  The variable HELLO-WORLD is unbound.也就是说只适用于对variable求值。
CL-USER> (symbol-function 'hello-world)
#<FUNCTION HELLO-WORLD>
函数总结:
(setf &rest args)        是引入一个变量,所以你发现他后面必须是一个可以接受值的对象,比如|hi|/hi等,而不能是'hi/:hi。|hi|--> hi ; hi--> HI
(set symbol new-value)   symbol千万别忘了用quote引用'hi/'|hi|。否则会报unbound错误。
(symbol-value symbol)    同上面一样,因为他们都是跟一个symbol,所以都别忘了加引号,并且|hi|-->hi ; hi-->HI
(symbol-function symbol) 同上。
(symbolp object)     

总而言之,我感觉除了setf/let/defparameter/defvar这几个引入变量的函数以外,其它的函数中的参数都必须先bound你才能进行下一步的处理。你像字面值本身就是值,而对于symbol你如果单写hi/'|hi|都会报错,而:hi例外。除了参数定义中形参不需要加引号,其它地方的话,要不加引号前提是你得已经bound了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值