python on the way

97 views
Skip to first unread message

jaime

unread,
Dec 26, 2012, 12:15:56 AM12/26/12
to cn-cl...@googlegroups.com
在看python,发现clojure中的一些之前觉得怪异的语法在python中也存在,看来动态语言各种特性要趋同的趋势越来越明显了。

是不是大家也别太纠结于语言工具的问题了,因为看来东西都快差不多了。。。。。

崔钢

unread,
Dec 26, 2012, 12:55:40 AM12/26/12
to cn-cl...@googlegroups.com
应该说这些语言越来越像lisp了。

--
May the force be with you.

Sun Ning

unread,
Dec 26, 2012, 2:49:50 AM12/26/12
to cn-cl...@googlegroups.com, jaime
�ٸ�����˵˵�ɡ���

On 12/26/2012 01:15 PM, jaime wrote:
> �ڿ�python������clojure�е�һЩ֮ǰ���ù��������python��Ҳ���ڣ���
> ����̬���Ը�������Ҫ ��ͬ������Խ��Խ�����ˡ�
>
> �Dz��Ǵ��Ҳ��̫���������Թ��ߵ������ˣ���Ϊ���������������ˡ���������
> --
> ��������ͣ�http://blog.clojure.cn/
> �����ʴ���վ��http://ask.clojure.cn/
> �����ʼ��б?https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
> ---
> ���յ����ʼ�����Ϊ������ Google ������̳�ġ�CN-Clojure����̳��
> Ҫ���������̳�����뷢�͵����ʼ��� cn-cl...@googlegroups.com��
> ͨ��������ַ���ʴ���̳��http://groups.google.com /group/cn-
> clojure?hl=zh-CN��
> <http://groups.google.com/group/cn-clojure?hl=zh-CN%A1%A3>
>
>

jaime

unread,
Dec 26, 2012, 9:28:32 PM12/26/12
to cn-cl...@googlegroups.com, jaime
也没有具体的例子。只是昨天看到python 3之后的赋值语句句法很灵活,令我想起了clojure里面的Destructuring;另外python里面的变量名与对象之间的关系和clojure里面的符号与对象直接的(逻辑)关系也是类似的。

孙兄想必对python很了解吧,问一下python里面有没有直接操控“符号”的方式呢?

在 2012年12月26日星期三UTC+8下午3时49分50秒,Sun Ning写道:
锟劫革拷锟斤拷锟斤拷说说锟缴★拷锟斤拷

On 12/26/2012 01:15 PM, jaime wrote:
> 锟节匡拷python锟斤拷锟斤拷锟斤拷clojure锟叫碉拷一些之前锟斤拷锟矫癸拷锟斤拷锟斤拷锓�拷锟�ython锟斤拷也锟斤拷锟节o拷锟斤拷
> 锟斤拷锟斤拷态锟斤拷锟皆革拷锟斤拷锟斤拷锟斤拷要 锟斤拷同锟斤拷锟斤拷锟斤拷越锟斤拷越锟斤拷锟斤拷锟剿★拷
>
> 锟角诧拷锟角达拷锟揭诧拷锟教�拷锟斤拷锟斤拷锟斤拷锟斤拷怨锟斤拷叩锟斤拷锟斤拷锟斤拷耍锟斤拷锟轿�拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟筋不锟斤拷锟剿★拷锟斤拷锟斤拷锟斤拷锟斤拷
> --
> 锟斤拷锟斤拷锟斤拷锟斤拷停锟�ttp://blog.clojure.cn/
> 锟斤拷锟斤拷锟绞达拷锟斤拷站锟斤拷http://ask.clojure.cn/
> 锟斤拷锟斤拷锟绞硷拷锟叫�https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
> ---
> 锟斤拷锟秸碉拷锟斤拷锟绞硷拷锟斤拷锟斤拷为锟斤拷锟斤拷锟斤拷 Google 锟斤拷锟斤拷锟斤拷坛锟侥★拷CN-Clojure锟斤拷锟斤拷坛锟斤拷
> 要锟斤拷锟斤拷锟斤拷锟斤拷锟教筹拷锟斤拷锟斤拷敕�拷偷锟斤拷锟斤拷始锟斤拷锟�cn-cl...@googlegroups.com锟斤拷
> 通锟斤拷锟斤拷锟斤拷锟斤拷址锟斤拷锟绞达拷锟斤拷坛锟斤拷http://groups.google.com /group/cn-
> clojure?hl=zh-CN锟斤拷
> <http://groups.google.com/group/cn-clojure?hl=zh-CN%A1%A3>
>
>

Zhitong He

unread,
Dec 26, 2012, 9:58:18 PM12/26/12
to cn-cl...@googlegroups.com
不能定义新的操作符,但可以针对已有的符号进行重载。
python中的符号其实是对Class中相应方法的语法糖,比如<<对应的是__lshift__,那只要在需要重载的Class里实现__lshift__就可以达到预期的修改。纯赋值的符号=除外。

比如有人搞了个pipe infix syntax: http://dev-tricks.net/pipe-infix-syntax-for-python

pudding的solo也很好玩:https://github.com/ZoomQuiet/solo/wiki


有哪些符号与内置方法可以看这里 http://docs.python.org/reference/datamodel.html




2012/12/27 jaime <xieji...@gmail.com>

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure?hl=zh-CN。
 
 



--
Zhitong He
Sun Yat-sen University

hyper-carrot

unread,
Dec 26, 2012, 10:32:53 PM12/26/12
to cn-cl...@googlegroups.com
Python有点儿FP特性但不是FP语言,Python纯动态类型语言、没有可选的类型声明方式,但是Python也不是为一个编程利器。

jaime

unread,
Dec 26, 2012, 11:04:55 PM12/26/12
to cn-cl...@googlegroups.com
我所说的符号是指“symbol”,并不单指操作符号。听下来python只有预定义的操作符可以被操控,那么它的灵活性相对于clojure来说还是要稍差一筹的吧大概

在 2012年12月27日星期四UTC+8上午10时58分18秒,Zhitong He写道:

dennis zhuang

unread,
Dec 26, 2012, 11:06:17 PM12/26/12
to cn-cl...@googlegroups.com
py的灵活性不要说跟clojure比了,比ruby它都要差点。我更建议看ruby。
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008


Qiu Xiafei

unread,
Dec 27, 2012, 12:25:50 AM12/27/12
to cn-cl...@googlegroups.com
看到ruby各种符号就头疼,怎么破?


2012/12/27 dennis zhuang <killm...@gmail.com>

Zhitong He

unread,
Dec 27, 2012, 1:40:54 AM12/27/12
to cn-cl...@googlegroups.com
我们偏向于优美的代码,但优美的代码不如没有代码,clojure是前者,py+第三方库是后者,故有学习py的必要。
但除非兴趣爱好外没必要学习ruby了。
学习就和驯兽差不多,只是狮子和兔子的区别。ruby和python都是兔子,建议步入狮子haskell的坑。


2012/12/27 dennis zhuang <killm...@gmail.com>

Zhitong He

unread,
Dec 27, 2012, 1:47:12 AM12/27/12
to cn-cl...@googlegroups.com
Python无法像LISP那样将代码当数据处理,这个是差距所在。


2012/12/27 jaime <xieji...@gmail.com>

dennis zhuang

unread,
Dec 27, 2012, 1:53:26 AM12/27/12
to cn-cl...@googlegroups.com
Ruby没什么特殊符号吧,除了郁闷的begin end之外。

Zhaolong Zhu

unread,
Dec 27, 2012, 2:05:55 AM12/27/12
to cn-cl...@googlegroups.com
要是和Lisp比灵活性(我理解的是抽象能力),Python当然就输了,请问有什么语言可以胜过Lisp吗?

Sun Ning

unread,
Dec 27, 2012, 2:07:40 AM12/27/12
to cn-cl...@googlegroups.com, jaime
python也有一点元编程的支持(__getattr__),不知道算不算你说的“操作符号”
具体的例子: https://github.com/sunng87/slacker-python/blob/master/slacker/client.py#L109

不过是像晓丹说的,python的灵活性比其他几个流行的语言要差不少

On 12/27/2012 12:04 PM, jaime wrote:
我所说的符号是指“symbol”,并不单指操作符号。听下来python只有预定义的操作符可以被操控,那么它的 灵活性相对于clojure来说还是要稍差一筹的吧大概

在 2012年12月27日星期四UTC+8上午10时58分18秒,Zhitong He写道:
不能定义新的操作符,但可以针对已有的符号进行重载。
python中的符号其实是对Class中相应方法的语法糖,比如<<对应的是 __lshift__,那只要在需要重载的Class里实现__lshift__就可以达到预期的修改。纯 赋值的符号=除外。

比如有人搞了个pipe infix syntax: http://dev-tricks.net/pipe-infix-syntax-for-python

pudding的solo也很好玩:https://github.com/ZoomQuiet/solo/wiki


有哪些符号与内置方法可以看这里 http://docs.python.org/reference/datamodel.html




2012/12/27 jaime <xieji...@gmail.com>
也没有具体的例 子。只是昨天看到python 3之后的赋值语句句法很灵活,令我想起了clojure里面的Destructuring;另 外python里面的变量名与对象之间的关系和clojure里面的符号与对象直接的(逻辑)关系也是类似的。

孙兄想必对python很了解吧,问一下python里面有没有直接操控“符号”的方式呢?

在 2012年12月26日星期三UTC+8下午3时49分50秒,Sun Ning写道:
锟劫革拷锟斤拷锟斤拷说说锟缴★拷锟斤拷

On 12/26/2012 01:15 PM, jaime wrote:
> 锟节匡拷python锟斤拷锟斤拷锟斤拷clojure锟叫碉拷一些之前锟斤拷锟矫癸拷锟斤拷 锟斤拷锓�拷锟�ython锟斤拷也锟斤拷锟节o拷锟斤拷
> 锟斤拷锟斤拷态锟斤拷锟皆革拷锟斤拷锟斤拷锟斤拷要 锟斤拷同锟斤拷锟斤拷锟斤拷越锟斤拷越锟斤拷锟斤拷锟剿★拷
>
> 锟角诧拷锟角达拷锟揭诧拷锟教�拷锟斤拷锟斤拷锟斤拷锟斤拷怨锟斤拷叩锟斤拷锟斤拷锟斤拷耍锟 斤拷锟轿�拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟筋不锟斤拷锟剿★拷锟斤拷锟斤拷锟斤拷锟斤拷

Sun Ning

unread,
Dec 27, 2012, 2:08:57 AM12/27/12
to cn-cl...@googlegroups.com, Zhitong He
lisp这个代码即数据只能说是太变态了,秒杀其他所有语言

On 12/27/2012 02:47 PM, Zhitong He wrote:
Python无法像LISP那样将代码当数据处理,这个是差距所在。


2012/12/27 jaime <xieji...@gmail.com>
我所说的符号是指 “symbol”,并不单指操作符号。听下来python只有预定义的操作符可以被操控,那么它的灵活性相对于clojure来 说还是要稍差一筹的吧大概

在 2012年12月27日星期四UTC+8上午10时58分18秒,Zhitong He写道:
不能定义新的操作符,但可以针对已有的符号进行重载。
python中的符号其实是对Class中相应方法的语法糖,比如<<对应的是 __lshift__,那只要在需要重载的Class里实现__lshift__就可以达到预期的修改。纯赋值 的符号=除外。

比如有人搞了个pipe infix syntax: http://dev-tricks.net/pipe-infix-syntax-for-python

pudding的solo也很好玩:https://github.com/ZoomQuiet/solo/wiki


有哪些符号与内置方法可以看这里 http://docs.python.org/reference/datamodel.html




2012/12/27 jaime <xieji...@gmail.com>
也没有具体的例子。只是昨天看到python 3之后的赋值语句句法很灵活,令我想起了clojure里面的Destructuring;另 外python里面的变量名与对象之间的关系和clojure里面的符号与对象直接的(逻辑)关系也是类似 的。

孙兄想必对python很了解吧,问一下python里面有没有直接操控“符号”的方式呢?

在 2012年12月26日星期三UTC+8下午3时49分50秒,Sun Ning写道:
锟劫革拷锟斤拷锟斤拷说说锟缴★拷锟斤拷

On 12/26/2012 01:15 PM, jaime wrote:
> 锟节匡拷python锟斤拷锟斤拷锟斤拷clojure锟叫碉拷一些之前锟斤拷锟矫癸拷 锟斤拷锟斤拷锓�拷锟�ython锟斤拷也锟斤拷锟节o拷锟斤拷
> 锟斤拷锟斤拷态锟斤拷锟皆革拷锟斤拷锟斤拷锟斤拷要 锟斤拷同锟斤拷锟斤拷锟斤拷越锟斤拷越锟斤拷锟斤拷锟剿★拷
>
> 锟角诧拷锟角达拷锟揭诧拷锟教�拷锟斤拷锟斤拷锟斤拷锟斤拷怨锟斤拷叩锟斤拷锟斤拷锟斤 拷耍锟斤拷锟轿�拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟筋不锟斤拷锟剿★拷锟斤拷锟斤拷锟斤拷锟斤拷

Lihe Wang

unread,
Dec 27, 2012, 8:27:46 AM12/27/12
to cn-cl...@googlegroups.com
符号这个东西实现起来好像是一个键值列表吧?只要是带着编译器跑的语言理论上都能搞吧?


Lihe Wang

unread,
Dec 27, 2012, 8:36:45 AM12/27/12
to cn-cl...@googlegroups.com
这个观点明显是错误的。python是不能像lisp那样优雅的处理,但是如果只是将代码变成数据,再执行,这个功能高级语言,只要是个带着编译器跑的,都能实现。

代码即数据的比较,基本上是跟C,pascal这样的纯编译型语言比的,跟python比,根本就是等价的。

Lihe Wang

unread,
Dec 27, 2012, 8:39:28 AM12/27/12
to cn-cl...@googlegroups.com
代码即数据有那么好么?偷偷告诉你,所有冯氏结构的计算机的汇编语言,全是代码即数据的。

Zhitong He

unread,
Dec 27, 2012, 9:05:58 AM12/27/12
to cn-cl...@googlegroups.com

代码即数据不是指eval,而是可以像处理数据一样处理自身的代码,仅带有运行时态是不够的。

举个例子 (* 3 4)

代码即数据是你可以认为这是一个数学表达式,执行后可以获得一个值,但也可以认为它是一个包含乘号、3与4的列表。
你可以随便修改这个列表再执行,执行的代码可以利用上下文,执行之后它也将变为程序本身,即程序有动态修改自己的能力。

python中的eval仅仅是执行一段代码,你不能利用它来动态创建一个函数。


Peter Norvig:编程语言的选择并不重要 http://simple-is-better.com/news/580 里面有一则趣闻:


其他人举出的材料中,最有意思的应该来自Lisp之父、计算机科学巨人约翰麦卡锡。这篇博客(无法直接访问)里生动讲述了这位图灵奖得主在某次听Peter Norvig改而鼓吹Python的演讲后的情景:

Norvig演讲后,进入提问环节。出乎我的意料,他点了一位皱巴巴的老头。老头的胡子和头发都花白了,而且乱糟糟的,看上去像是来此参观但是迷路了,到这里来休息一下,好奇地听听我们在说什么。我第一个念头是,估计他已经被这么艰深的话题弄晕了。但是马上想到,不对啊,这里离斯坦福很近,这老头的年纪也对,难道是……

只听Norvig说:“是,John,你有什么问题?”我记不清Lisp之父当时怎么问的了,但不超过十个词,就是问 Python是否能如Lisp那样优雅地像数据一样处理代码。“不,John,不行。”Norvig回答,然后静等麦卡锡继续发问。但是,老人什么也没有再说。此时真是无言胜千语啊……






2012/12/27 Lihe Wang <wanglihe....@gmail.com>

Sun Ning

unread,
Dec 27, 2012, 9:19:38 AM12/27/12
to cn-cl...@googlegroups.com, Lihe Wang
代码即数据可能说代码可被编程更直接好理解
lisp的宏因此可以保持和lisp一样的语法



On 12/27/2012 09:39 PM, Lihe Wang wrote:
代码即数据有那么好么?偷偷告诉你,所有冯氏结构的计算机的汇编语言,全是代码即数据的。


在 2012年12月27日下午3:08,Sun Ning <class...@gmail.com>写 道:
lisp这个代码即数据只能说是太 变态了,秒杀其他所有语言

On 12/27/2012 02:47 PM, Zhitong He wrote:
Python无法像LISP那样将代码当数据处理,这个是差距所在。


2012/12/27 jaime <xieji...@gmail.com>
我所说的符号是指 “symbol”,并不单指操作符号。听下来python只有预定义的操作符可以被操控,那么它的灵活性相对于clojure来 说还是要稍差一筹的吧大概

在 2012年12月27日星期四UTC+8上午10时58分18秒,Zhitong He写道:
不能定义新的操作符,但可以针对已有的符号进行重载。
python中的符号其实是对Class中相应方法的语法糖,比如<< 对应的是 __lshift__,那只要在需要重载的Class里实现__lshift__就可以达到预期的修改。纯赋值 的符号=除外。

比如有人搞了个pipe infix syntax: http://dev-tricks.net/pipe-infix-syntax-for-python

pudding的solo也很好玩:https://github.com/ZoomQuiet/solo/wiki


有哪些符号与内置方法可以看这里 http://docs.python.org/reference/datamodel.html




2012/12/27 jaime <xieji...@gmail.com>
也没有具体的例子。只是昨天看到python 3之后的赋值语句句法很灵活,令我想起了clojure里面的Destructuring; 另 外python里面的变量名与对象之间的关系和clojure里面的符号与对象直接的(逻辑)关系也是类似 的。

孙兄想必对python很了解吧,问一下 python里面有没有直接操控“符号”的方式呢?

在 2012年12月26日星期三UTC+8下午3时49分50秒,Sun Ning写道:

Zhitong He

unread,
Dec 27, 2012, 10:27:09 AM12/27/12
to cn-cl...@googlegroups.com
虽然lisp和python分别建立在lambda calculus和图灵机的基础上,但他们是图灵等价的,有相同的计算能力,可以互相模拟。

拥有相同计算能力的语言,能做的事情都一样,但这不能否认抽象和语言表达能力的重要性,写C代码总比给输入纸带来得方便。

代码即数据,准确来说是同像性,是说Lisp语言本身是由自己的数据结构表示,它拥有操纵自身结构和行为的能力,这种能力需要思维的一次跳跃(试想一个自己舔自己的棒棒糖)。

而你所说的汇编中的代码即数据,是指根据指令执行不同的指令,并不是指这种同像性(homoiconicity)。

代码即数据的另一面是数据即代码,许多编码语言都在用,比如django的配置文件是settings.py,不需要一段解析配置的代码,直接拿来当代码执行就完成了配置项的初始化。

jaime

unread,
Dec 27, 2012, 9:40:48 PM12/27/12
to cn-cl...@googlegroups.com
我也是这样想的:
  1. 等价的
  2. 抽象和语言表达很重要
  3. 代码和数据使用同样的结构(就是‘list’结构),在高级语言中,这的确是只有Lisp语言才有的特征,这种特征使得操纵代码几乎和操纵数据一样容易
我想还有一种语言同样具有代码/数据同构的特征,大家猜猜是什么语言来着?

在 2012年12月27日星期四UTC+8下午11时27分09秒,Zhitong He写道:

Alex Han

unread,
Dec 27, 2012, 9:45:39 PM12/27/12
to cn-cl...@googlegroups.com
我想还有一种语言同样具有代码/数据同构的特征,大家猜猜是什么语言来着?
--》难道jaime要说自然语言么?没这么不靠谱吧。。。能够自身改变构造的图灵机也是这样的一种东东,一个状态机根据外部和内部状态更改自己的状态转移图。。。


2012/12/28 jaime <xieji...@gmail.com>
1E3.gif

dennis zhuang

unread,
Dec 27, 2012, 9:46:47 PM12/27/12
to cn-cl...@googlegroups.com

xml?

1E3.gif

Zhitong He

unread,
Dec 28, 2012, 12:27:37 AM12/28/12
to cn-cl...@googlegroups.com

同像性的具体的表现是某一段代码,将它保存成数据就是它本身;而加载数据并将它eval的结果相当于执行了这段代码。

因此机器码也是(不是抽象于其上的汇编),机器码的一段代码对应的数据形式就是它本身,也即内存里的字节。

高级语言中除了Lisp系还是有其它的,比如Prolog也是,可参考wiki的例子。









2012/12/28 jaime <xieji...@gmail.com>

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure?hl=zh-CN。
 
 
1E3.gif

jaime

unread,
Dec 28, 2012, 12:53:26 AM12/28/12
to cn-cl...@googlegroups.com
其实我想说的正是机器码,“010101001110010100.......”一看就心碎了一地啊。。。。

至于Prolog,因为它的工作方式比较特殊,吾至今只知浅表,尚未参悟透彻。
Prolog挺有趣的,而且可以引发思考,它是我唯一觉得是真正在处理“what”而不是“how”的编程语言。大家不妨去看看,作为入门了解,我推荐Paul Brna的《 Prolog Programming - A First Course》

在 2012年12月28日星期五UTC+8下午1时27分37秒,Zhitong He写道:

Qiu Xiafei

unread,
Dec 28, 2012, 1:07:38 AM12/28/12
to cn-cl...@googlegroups.com
那我是不是可以理解为几乎所有脚本语言都是这样的,python, perl, ruby, shell.....把代码(数据)保存到文件,然后解释器load一下.....

我觉得同向性更重要的表现是可以用代码操作代码,就如同操作数据一样,比如clojure里头写宏,经常把传入的代码拆分、组装,实现新的功能。但是在机器码(汇编)的场景中,指令就是指令,数据就是数据,没见过谁把一个指令加一,得到另外一个指令的(当然理论上你也可以这么做)。


2012/12/28 Zhitong He <hez...@gmail.com>
1E3.gif

Zhitong He

unread,
Dec 28, 2012, 1:07:32 AM12/28/12
to cn-cl...@googlegroups.com
我也只接触了一点点Prolog,受限于世界的复杂,这种数理逻辑方向的研究在AI领域到达“专家系统”就差不多了,近年来流行机器学习和统计的方法。尽管如此逻辑推理也是很有意思的事情。

虽然不够Prolog特性丰富,但依然推荐本邮件列表从core.logic开始,有人拿来解数独




2012/12/28 jaime <xieji...@gmail.com>

jaime

unread,
Dec 28, 2012, 1:15:15 AM12/28/12
to cn-cl...@googlegroups.com
你说的对。所以我说的只是同构,意指“结构相同”。我们常说的的代码=数据的确应该包含两方面吧:一是同构;二是可操控性(‘eval’理当属于这其中部分)。没有提供同构的语言为了增加灵活性大概有三种方式:1 提供eval 2 提供可编程的元对象 3 提供编译器选项。常见的大概只有1和2了,它们都是在操控性上面下的功夫。


在 2012年12月28日星期五UTC+8下午2时07分38秒,Qiu Xiafei写道:

Kymair

unread,
Dec 28, 2012, 2:53:16 AM12/28/12
to cn-cl...@googlegroups.com
语言和工具的选择是非常重要的。我不知道为什么一提到语言就会有人出来说:“让我们别讨论语言了,他们都是一样的”
当然,语言到最后都会变成0和1来被运行;当然,几乎所有的“语言”都图灵完备。
但是它给程序员塑造的心智模型是完全不一样的。
想起来前几年读到的Linus关于C++的评论(http://blog.csdn.net/turingbook/article/details/1775488),以及Coders at work里顶级大牛们对于C++几乎一致的负面意见,我现在终于能稍微体会到,不恰当的语言,当然也能够大部分时候完成你的工作,但它会跟你增加额外的心智负担。

另外强烈推荐一下Coder at work这本书 :-) 现在在读第二遍,非常过瘾

Best Regards
Kymair Wu


2012/12/28 jaime <xieji...@gmail.com>

wanglihe

unread,
Dec 28, 2012, 8:00:26 AM12/28/12
to cn-cl...@googlegroups.com
代码即数据,你给出了定义,同像性,是吧?

我就不明白了,凡是带着编译器,也就是说有能力处理自身的语言怎么就不是是同像的了?

从大的方面说,c也是同像的,self hosting之后,就同像了。我们用c写的编辑器写代码,用c写的编译器编译,在c写的操作系统上运行,并产生出更多的c代码。哪一点儿不是同像的?lisp,以及其他努力向lisp发展的语言,比如python,只是把这个同像的过程缩短了。
python运行的时候可以编译自身并运行,可以用各种方法生成代码,并且编译后加载运行,怎么就不是同像的了?

你先前举的那个老大的故事我也看到过。但是,注意,人家问的是,能不能优雅的,仅此而已。

lisp真正的强大,在于eval,没错,因为有了它,就可以处理自身。但是,别忘了,哪门真正的通用语言,不是以此为目标?说白了,就是自编译,构造自身语言的抽象,构造自身语言的虚拟机。

我学了这么多语言,深刻的理解计算机语言是什么,有个观点不是原创的,但是忘了哪本书了,是这么说的:每一层语言,都可以在其上建立一个新的语言,抽象出新语言的运行基本框架,而其抽像程度更高,使用更方便,但是,处理能力是等价的。从机器语言,到forth, 到c,甚至到sql语言,每一层,都是如此。不过,sql不再是通用语言了。

我喜欢lisp,但是从来没觉得它强得有多过火。我喜欢clojure,但不是因为它长得像lisp,而是对并发的新思考。

在 2012年12月27日星期四UTC+8下午11时27分09秒,Zhitong He写道:

dennis zhuang

unread,
Dec 28, 2012, 8:04:23 AM12/28/12
to cn-cl...@googlegroups.com
你理解的同像,跟他说的同像是两个概念。你的理解,更像是所谓元循环的概念。

同像,在我看来很重要的一点是literal,也就是说代码本身的literal就是该语言的数据结构,该语言的数据结构,即是代码本身。


--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure?hl=zh-CN。
 
 

dennis zhuang

unread,
Dec 28, 2012, 8:05:45 AM12/28/12
to cn-cl...@googlegroups.com
同像的定义是很明确的

Kymair

unread,
Dec 28, 2012, 8:17:03 AM12/28/12
to cn-cl...@googlegroups.com

是啊…楼上说的那不叫homoiconicity啊…概念还是要搞清楚的。

再说,语言的“处理能力”即使一样,也不是重点。我们当然可以用区位码打字,我们当然可以手写并发代码。如你所说,编程是一层层累积抽象的过程,适当的语言可以帮助我们在更多的领域,达到更高更好的抽象。

Lisp的强大,在于Lisp就是计算本身,几乎是lambda calculus的直接体现。

Lihe Wang

unread,
Dec 28, 2012, 8:19:06 AM12/28/12
to cn-cl...@googlegroups.com
庄神发话了,激动。

如果是这种定义的话,嗯,确实在同像性上,lisp比起python来,强大得太多。
但我的理解来说,比起python来说,lisp的eval实现得更容易了而已,python实现的更难一点儿而已。当然,这一点的强大,放大到宏之后,写代码就很省手指头啊。

Lihe Wang

unread,
Dec 28, 2012, 8:23:52 AM12/28/12
to cn-cl...@googlegroups.com
我之前没有接触过“同像”这个概念,代码即数据又让我直接想到冯氏结构的计算机。想当然的以为这两个是同意词。
我错了。

Lihe Wang

unread,
Dec 28, 2012, 8:36:26 AM12/28/12
to cn-cl...@googlegroups.com
我倒是很赞同lisp就是lambda calculus的直接体现这句话。数学这种东西,因为抽像的很好,写编译器和在其上构造新语言,甚至不用修改编译器。


在 2012年12月28日下午9:17,Kymair <kym...@gmail.com>写道:

Qiu Xiafei

unread,
Dec 28, 2012, 9:29:50 AM12/28/12
to cn-cl...@googlegroups.com
俺觉得py还是不算,py不能把一段代码改吧改吧变成另一段儿吧,lisp能。写文件改了重新load不算,因为所有语言都能这么做,那讨论就没有任何意义鸟。。。。


2012/12/28 Lihe Wang <wanglihe....@gmail.com>

Shen, Feng

unread,
Dec 28, 2012, 10:11:52 AM12/28/12
to cn-cl...@googlegroups.com
说实际点的。

Clojure有宏(其它Lisp)也有,可以通过写宏,生成代码,并且就像操作数据结构(list),生成代码。  
你写一段代码 =》 这段代码生成另外的代码 =》 被执行。

这是一种非常强悍的能力,因为对于JAVA,C,C++,他们有逻辑抽象能力(能通过循环,if,顺序,函数等),而Clojure这种Lisp还有代码抽象能力(或者语法抽象)。这种能力能解决很多事情,比如:
Java6 没有 python 的with,只能求java7 搞定,但是LISP 可以自己解决。

好玩,好用。 这里有一个宏帮助从Request取参数,并且把limit, offset这里规范化(转成int, 限定limit范围)等,没有语法抽象是比较难做到的。

沈锋
美味书签 : http://meiweisq.com


2012/12/28 wanglihe <wanglihe....@gmail.com>

Zhitong He

unread,
Dec 28, 2012, 2:13:20 PM12/28/12
to cn-cl...@googlegroups.com
Lisp系语言是许多程序员学习FP的第一站,从传统语言来到Lisp系的人都推崇宏,因为我们厌倦了代码冗余与复制粘贴。

得益于同像性以及引用、反引用等符号,在数据和代码的混合中Lisp的宏拥有创造新的语法的能力,可以建立DSL,改变整个游戏规则。

从节省代码以元编程的角度,我很推崇宏,尤其是自己工作中使用C++,对比起来只有羡慕嫉妒恨。

但没有必要过度迷恋宏,从本质上,宏是代码生成,与Python的eval无异。(Python也可以对字符串进行解析转换,再eval插入本身,只是欠缺了我们所关心的表达能力。)如果函数能让FP的Composable做到极致,宏是不需要存在的,它是我们无法进一步实现代码复用转而走代码生成之路出现的产物。这也是我们优先使用函数组合而非宏的原因。

当然,虽然不少语言都支持通过宏进行扩展,Lisp系的macros, OCaml的Camlp4, Haskell的Template Haskell,但这其中只有Haskell的Template Haskell能够做到编写了正确的宏代码,扩展后也一定是正确的代码,即类型正确。而其它有可能会生成错误的代码,导致运行时错误,这里有着本质的区别。




2012/12/28 Shen, Feng <she...@gmail.com>
--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了 Google 网上论坛的“CN-Clojure”论坛。
要向此网上论坛发帖,请发送电子邮件至 cn-cl...@googlegroups.com
通过以下网址访问此论坛:http://groups.google.com/group/cn-clojure?hl=zh-CN。
 
 



--
Zhitong He
@0xffffull
Sun Yat-sen University

Zhitong He

unread,
Dec 28, 2012, 2:27:38 PM12/28/12
to cn-cl...@googlegroups.com
Haskell里不需要宏,因为它的抽象能力把大部分的重复都避免了,对于真正的重复任务,用Template Haskell足已。

不过还是最前面提到的,优美的代码不如没代码,再抽象不如不用抽象。
从工程实用性的角度,大量第三方库的Clojure/Python/Ruby都是很棒的选择,用C++的屌丝对楼上的各位表示羡慕。


2012/12/29 Zhitong He <hez...@gmail.com>



--
Zhitong He
@0xffffull
Sun Yat-sen University

江云帆

unread,
Dec 29, 2012, 2:42:57 AM12/29/12
to cn-cl...@googlegroups.com
呵呵  其实我选择clojure就是因为

1, 我在python里大量使用列表推导式 但因为缺乏宏这类东西 还是有不少必须重复的代码
2, clojure看起来更自然点 我是vim用户 cl那种大量圆括号眼睛受不了

在 2012年12月26日星期三UTC+8下午1时15分56秒,jaime写道:
在看python,发现clojure中的一些之前觉得怪异的语法在python中也存在,看来动态语言各种特性要趋同的趋势越来越明显了。

是不是大家也别太纠结于语言工具的问题了,因为看来东西都快差不多了。。。。。

dennis zhuang

unread,
Dec 29, 2012, 7:46:03 AM12/29/12
to cn-cl...@googlegroups.com

宏是编译展开的,跟eval还是不一样。

Zhitong He

unread,
Dec 29, 2012, 10:10:16 AM12/29/12
to cn-cl...@googlegroups.com
对,宏与eval是不同角度的东西,宏+宏处理器+生成代码的执行,才大概等价于代码片段+eval。

只是从本质上,它们对语言抽象的贡献是纯粹地帮助重复执行任务,也即代码生成,编译前后细节的东西了。


2012/12/29 dennis zhuang <killm...@gmail.com>



--
Zhitong He
Sun Yat-sen University

Lihe Wang

unread,
Dec 29, 2012, 7:39:31 PM12/29/12
to cn-cl...@googlegroups.com
气死我了,为什么就不能放过python。我只是承认说同像上,我错了,而且python确实不如lisp,所以python不能优雅的将自己的代码处理成为自己运行时的一部分。但是,lisp能做的,python恶心一点一样能做的。

python也是可以批量生成代码的,上代码:

link = """def link_{0}_{1}({arg}):
        return "{0}_"+"{1}_" + str({arg})
        """
link_name = "link_{0}_{1}({arg})"

a = ["a{0}".format(i) for i in range(5)]
b = ["b{0}".format(i) for i in range(7)]

for x,y in [(A,B) for A in a for B in b]:
    exec(link.format(x,y,arg="n"),globals())
for x,y in [(A,B) for A in a for B in b]:
    for z in range(1,10):
        print(eval(link_name.format(x,y,arg="{argname}").format(argname="z")))

以上代码展示了批量生成函数,我个人认为肯定没有宏长得好看,但是就批量生成代码这一个侧面,能力上是一致的。但是因为是字符串,几乎没办法调试,编译器也帮不上忙。而且,宏嵌套,python在非常恶心的情况下,应该也能实现,但是我大早上的就不写了,万一出个bug,调起来我就不用吃饭了。

上次针对scala,说scala性能有问题,这次又说python不能跟宏比,大家能不能不要随便的贬损其他语言。我觉得,本质上,python这种带着编译器的语言,跟lisp基本处于同一级。

huaxun wu

unread,
Dec 29, 2012, 9:25:00 PM12/29/12
to cn-cl...@googlegroups.com
python带着编译器,但只是带着运行,无法通过代码动态的修改编译器的行为,lisp的宏可以.
lisp的宏从本质上讲是赋予了程序修改编译器的能力,使程序员能完全控制自己使用的语言.这和你说的代码生成后eval一下不在同一个级别上.

Ruiyun Wen

unread,
Dec 29, 2012, 10:37:36 PM12/29/12
to cn-clojure
我觉得,从能不能做到这个层面来说,确实只要具备运行期动态求值能力的语言都不会有太大区别。只不过clojure宏本身是语言的一部分,编译器能帮我们做很多事情,让我们更不容易犯错误,程序看起来一致性也更好。字符串拼接往往是滋生问题的温床,类比SQL注入。何况,拼接的还是Python这种对缩进有要求的语言。

但是,如果说一开始语言论战(其实个人很喜欢这个题材),就把clojure宏放到前锋的位置,我认为是有害的。如果是追求代码复用,绝大多数情况下函数就足够了。宏往往只是在需要扩展语言构造,或是对某种符号模式进行封装的时候才真正必要。结合我自己的体验,通过写宏解决某些特定的恶心问题,确实能带给自己相当愉悦的体验,但clojure真正让我欲罢不能的,还是其作者和整个社区通过这门语言传达出来的价值观,简单、直接、可控。其他语言不是不能做到这些,事实上,前段时间写的一个非面向对象C++小程序就让我很开心,但这些语言的整体环境很多时候的确让人无奈。

我在写C++、C#和Java(初学)的时候,总会间歇性的爆文明用语,但写Python(写的不算多)的时候好像没有过。所以,就算Python没有lisp那样的源码操纵能力(说起来python有编译期一说吗?),我也总会向别人推荐它。

Zhitong He

unread,
Dec 29, 2012, 11:01:57 PM12/29/12
to cn-cl...@googlegroups.com
Lihe激动了,
我后面都是在说需要代码生成是因为抽象不够,是讲宏的不必要性,没有Lisp/Python比较的意思。
即使比较也只是提了一下Haskell比Lisp/OCaml做到的抽象程度高,鼓励FP爱好者学习Haskell。


1. 计算能力与同像性(比较了两个语言)
代码即数据中说同像性让Lisp表达能力很强,因为数据与代码的混合让宏写起来方便,再加上有动态修改。
动态修改其实不过是运行时的中间层符号查找行为,将所有函数调用换成eval一个字符串变量,那么python也能做到。
另外,即便表达能力强些,优美的代码不如不写代码,这点上python的第三方库完胜。


2. 宏只是为了完成重复任务(比较的是宏)
除了表达能力强些没有再继续对比lisp/python,反而是在以说虽然推崇宏但没必要神化宏。
因为宏表达能力虽然强,但对程序抽象的贡献只是解决重复任务,能不用尽量不用,足够抽象时宏是没必要存在的。
在代码生成的本质上,它是和python的eval无区别的,也可以换成bach -c,没有任何贬低python的意思,抱歉让你误解了。


Sun Ning

unread,
Dec 29, 2012, 11:11:27 PM12/29/12
to cn-cl...@googlegroups.com, Zhitong He
空谈误国,动气伤肝
大家还是多写写代码吧,用代码说话吧,讨论语言实在是个无底洞

On Sun 30 Dec 2012 12:01:57 PM CST, Zhitong He wrote:
> Lihe激动了,
> 我后面都是在说需要代码生成是因为抽象不够,是讲宏的不必要性,没有
> Lisp/Python比较的意思。
> 即使比较也只是提了一下Haskell比Lisp/OCaml做到的抽象程度高,鼓励FP爱好
> 者学习Haskell。
>
>
> 1. 计算能力与同像性(比较了两个语言)
> 代码即数据中说同像性让Lisp表达能力很强,因为数据与代码的混合让宏写起来
> 方便,再加上有动态修改。
> 动态修改其实不过是运行时的中间层符号查找行为,将所有函数调用换成eval一
> 个字符串变量,那么python也能做到。
> 另外,即便表达能力强些,优美的代码不如不写代码,这点上python的第三方库
> 完胜。
>
>
> 2. 宏只是为了完成重复任务(比较的是宏)
> 除了表达能力强些没有再继续对比lisp/python,反而是在以说虽然推崇宏但没
> 必要神化宏。
> 因为宏表达能力虽然强,但对程序抽象的贡献只是解决重复任务,能不用尽量不
> 用,足够抽象时宏是没必要存在的。
> 在代码生成的本质上,它是和python的eval无区别的,也可以换成bach -c,没
> 有任何贬低python的意思,抱歉让你误解了。
>
>
Reply all
Reply to author
Forward
0 new messages