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 :INTERNALsetf / set 的区别
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。所以我们就引入了双竖线来保持原样。
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>函数总结: