免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234567
最近访问板块 发新帖
楼主: starwing83
打印 上一主题 下一主题

[C] 站在月亮看地球——牛逼的新语言 MoonScript [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
61 [报告]
发表于 2011-08-19 19:04 |显示全部楼层
回复 193# OwnWaterloo


    好,我们认为shit就是个悲观和乐观的问题可以吗?我觉得Lua比别的其他的什么好有问题吗?


继续说,我的思想不是对你的误读,我的思想就是我的思想。我的命题是这样的:

Lisp的执行有且只有两个不同的分支:special-form和normal-form,其中special-form对其所有的参数不求值,而直接传递给函数,而normal-form对其所有参数求值再调用。

就这么简单,期间没有什么东西叫做macro的。macro+special-cons == special-form。

我已经说了近三遍了,你都没有回应,是故意的么?宏能不能被展开,和它调用时参数怎么被求值,一点关系都没有!!!


是不是语言必不可少的部分?貌似是你新提到的观点呢?找不到论据了么?可是我想再问问。是不是语言必不可少的部分,和他调用的时候参数怎么求值,有必然联系么???


说白了,我现在就是对Lisp做着你最讨厌的二元论:“Lisp只有两种调用方式,要么对参数求值,要么不求值”,这才是我的命题,你到底在反驳什么呢?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
62 [报告]
发表于 2011-08-19 19:14 |显示全部楼层
回复 196# OwnWaterloo


    很好,我觉得我抓到你的思想和我们的必然分歧了。

——原来,你的意思是,macroexpand这个操作本身,也是调用的一部分!

是这个意思吧?

3我们放着等会儿说,我们先解决这里的分歧(其实3我已经说过了,发明这种概念是无用的,将special-form和macro归并会更简单)。


我们说一下我对Lisp调用的步骤:
1. 读取表的第一项,在求值或者不求值(这里是实现定义,Scheme求值而Elisp不求值)后,查证符号表,寻找对应的操作以及类型。
2. 操作分为两种,special-form和normal-form,如果是normal-form,则对后面所有的表,按照刚才所说的方式求值(即本过程),然后待用。
3. 如果是special-form,直接将cdr(list)(即表从第二项开始的部分)交给对应操作。Over
4. 如果是normal-form,将计算后的结果交给对应操作。Over

这里注意了,如果是special-form,那么对应的操作是什么呢?答案是:对于macro,是macroexpand,对于狭义special-form,是交给下层直接处理(比如C代码)。
如果是normal-form,实际上对于操作也是两种:对于函数,执行函数的字节码,对于原始函数,直接将结果表给(比如)C代码让其执行。

看到了吗?单论调用步骤,一个form是specia-form还是macro是无所谓的。因为macroexpand操作和交给下层直接处理操作是平级的!

当然macroexpand操作之后还需要一些工作,比如将代码插入待分析序列,继续按照刚才的流程分析等等。但这些事情,都是属于“对macro本身的操作的附加动作”,而不是一些额外的,可以在调用过程中将macro和狭义special-form分开的事情!!

进一步说,其实“对参数进行求值(即第二步)”也可以看做是对函数这种类型本身的特殊操作!在这个意义上,其实可以看做对所有的form,都是不计算参数的!而是根据不同的类型,去做适当地操作!这种方式实际上更加泛型。

这就是我的意思。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
63 [报告]
发表于 2011-08-19 19:37 |显示全部楼层
回复 200# OwnWaterloo


    关于这一点,请参看你的楼上。我做了完整回答,我相信这是个观念问题。


下面的问题,1我已经回答了好几楼了,虽然没有明确回答,好,既然你要明确回答,那么的确第一个不能被展开而第二个能,这代表他们不同,然而不代表他们的调用策略就得不同。详情参看你的楼上。

至于问题二:带是为了有实际的用处——调试,然而标准不会去管调试这种东西——你觉得C语言会把吸血鬼或者dbghelp列为标准么?但是无论哪个C实现都得至少支持一份是不?

问题是,标准这么做是强调一个重要的暗示:Scheme不需要macroexpand,至于为什么不需要我解释过了。

我觉得有macroexpand——尽管它很爽,很利于调试,但是就如同gdb一样,不适合在正式的项目里面作为一部分——偶尔拿来调试还是可以的。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
64 [报告]
发表于 2011-08-19 19:45 |显示全部楼层
回复 204# OwnWaterloo


    这样,我形容一下(if c x y)和(push l x)我认为的执行流程吧。

1. 首先,这是两个表。
2. 我们先说1. 看到if,这是个关键字,有超多的执行方法,我们说最经典的那种,首先if是special-form,于是将后面的部分(表(c x  y))直接传给if对应的过程。
   2.1 if得到了c和x和y三个东西,首先对c进行eval,得到值,然后根据值,决定对x或者y 来eval,剩下东西忽略。
   2.2 然后x和y经历相同过程,并且剩下的没有被执行的被回收,这是后话了。
3. 我们说2.假设2是个宏(为嘛= =通常这是个函数哇……性能原因么),同样的,将表(l x)传递给宏的宏体。
   3.1 宏体产生实际代码。
   3.2 将实际的代码插入分析栈,重新按整个流程分析。

你看,2.1和2.2和3.1和3.2实际上是我所谓的同一个流程——操作,他们可能不同(必然的,就算是函数执行流程也可能不同——C函数或Lisp函数),但是大体框架(我是说2.和3.)是完全一致的。

概括说来,if的“操作”就是判断加eval,而宏的操作就是执行加插入(代码)。他们都是操作。我将其抽象在一起(类似多态),所以我才说,Lisp只分special-form和normal-form,原因是参数求值的方式不同,至于求值完了需要做什么操作,是操作自己的事情——你总不能期待add能做跟sub一样的事情吧?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
65 [报告]
发表于 2011-08-19 19:58 |显示全部楼层
回复 210# OwnWaterloo


    你们两个肯定有奸情!

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
66 [报告]
发表于 2011-08-23 10:37 |显示全部楼层
回复 226# KanonInD


    你这个是Haskell……

更正常的写法是这样的:

deriv f x = (f (x+delta) - f x)/delta
    where delta = 0.00001
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP