Lisp中的Symbol

25 views
Skip to first unread message

lvscar

unread,
Jul 5, 2009, 8:36:30 AM7/5/09
to lisp.china
原文发表于 http://blog.lvscar.info/2009/7/5/symbol_in_lisp/

Lisp中的Symbol(符号)这个概念在我熟悉的Python,Java,php中并不存在. 以下稍作总结以备忘:

一个Symbol在Lisp程序任意Scope中拥有唯一的字符名,用于在特定Scope中通过该Symbol来找到某个Variable(变量)或
Function(函数). 这个概念类似其他语言中的Variable name(变量名)或Function name(函数名)。在python
或Java中,变量名或函数名和名称所指的变量或函数同生同死,密不可分. 但Lisp的Symbol显得更为独立.


#### Symbol(符号) vs Viriable(变量)

* Lisp程序中,Viriable(变量)的值存储在指向该变量的Symbol(符号)的value cell(值单元)中. 一个Symbol
在利用value cell储存变量的同时也可以利用function cell(函数单元)存储Function(函数)或Macros(宏).
**(就是说一个Symbol可以同时被作为变量和函数的标示使用)**


#### Symbol带来的优势
在其他语言中当你的程序执行完 x= 7 语句后,你就不能再对x有进一步的操作了(对x的操作变成了对7的操作)。由于Symbol的value
cell能存储Unevaluated variable(未解释变量)。 你可以随意变更Symbol value cell中存储的变量,然后在任
意时候对其进行evaluate。 在其他语言中需要通过eval(myCodeString)来获得的延迟执行特性在Lisp中是内置且直观的。这种
meta-program(元编程)技巧在处理以输入(远程获取,用户输入)作为运行代码时能发挥极大的优势.

Zoom.Quiet

unread,
Jul 5, 2009, 9:17:20 AM7/5/09
to lisp...@googlegroups.com
2009/7/5 lvscar <lvs...@gmail.com>:
> 原文发表于 http://blog.lvscar.info/2009/7/5/symbol_in_lisp/
>
KAO!
这么宅的列表都被发现了哪!!!

--
http://zoomquiet.org 人生苦短,Pythonic!-)
一个人如果力求完善自己,就会看到:为此也必须同时完善他人. 一个人如果不关心别人的完善,自己便不可能完善!

Jianshi Huang

unread,
Sep 1, 2009, 1:17:56 PM9/1/09
to lisp.china

On Jul 5, 9:36 pm, lvscar <lvs...@gmail.com> wrote:
> 原文发表于http://blog.lvscar.info/2009/7/5/symbol_in_lisp/


>
> Lisp中的Symbol(符号)这个概念在我熟悉的Python,Java,php中并不存在. 以下稍作总结以备忘:
>
> 一个Symbol在Lisp程序任意Scope中拥有唯一的字符名,用于在特定Scope中通过该Symbol来找到某个Variable(变量)或
> Function(函数). 这个概念类似其他语言中的Variable name(变量名)或Function name(函数名)。在python
> 或Java中,变量名或函数名和名称所指的变量或函数同生同死,密不可分. 但Lisp的Symbol显得更为独立.
>

"变量名或函数名和名称所指的变量或函数同生同死,密不可分." 其实Lisp中也是如此,区别是对lisp的 reader (java/
python 叫 parse)来说,程序是由 symbols 组成的,由 symbol 所在的 scope 和程序中的位置决定该
symbol 的含义。正由于程序是由 symbol 组成的(List),所以对源程序的操作转换也方便,而且各种lisp中不同package的
symbol是不同的(java/python 中的 namespace 或 module),所以对关键字的重定义也成为可能,且不会破坏存在于其
他package中的程序。比如 common lisp 中的 screamer。


> #### Symbol(符号) vs Viriable(变量)
>
> * Lisp程序中,Viriable(变量)的值存储在指向该变量的Symbol(符号)的value cell(值单元)中. 一个Symbol
> 在利用value cell储存变量的同时也可以利用function cell(函数单元)存储Function(函数)或Macros(宏).
> **(就是说一个Symbol可以同时被作为变量和函数的标示使用)**

value cell 的说法是针对 global variable 的。value cell 和 function cell 分开的称为
lisp-2(如 common lisp),一起的则称为 lisp-1(如 scheme)

>
> #### Symbol带来的优势
> 在其他语言中当你的程序执行完 x= 7 语句后,你就不能再对x有进一步的操作了(对x的操作变成了对7的操作)。由于Symbol的value
> cell能存储Unevaluated variable(未解释变量)。 你可以随意变更Symbol value cell中存储的变量,然后在任
> 意时候对其进行evaluate。 在其他语言中需要通过eval(myCodeString)来获得的延迟执行特性在Lisp中是内置且直观的。这种
> meta-program(元编程)技巧在处理以输入(远程获取,用户输入)作为运行代码时能发挥极大的优势.

er... 完全不认同,以上是哪里看来的?

Reply all
Reply to author
Forward
0 new messages