免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
151 [报告]
发表于 2011-08-19 12:50 |只看该作者
回复 149# Fatihyang


    其实这个帖子是讨论lisp和functional programming language之类的.

    C/C++是很好很强大。但是,有必要接触一些在范式(programming paradigm)上根本不同的语言,尤其是FP语言,这么说的原因是因为接触不同的范式会令你思考它们的差别,以及为什么它们有这样的差别,继而从这种差别上再度去考察关于计算机本质上的一些东西。

    现代的许多FP语言,真正的发源都是lisp. lisp是被很多大牛赞美的语言,所以偶尔放下神马C++接触一下这些也不错。何况如LS各位所言,lisp的“语法”简洁到令人难以置信,单是为了见识这么简洁的语法为什么带来那么强大的功能就值得一学。

    人嘛... 眼界多开阔点,多见识点东西总是好的,要不那么多时间怎么打发。你把全部时间花在C++上,敢问C++功底又如何?敢跟ow一拼不?

论坛徽章:
0
152 [报告]
发表于 2011-08-19 13:15 |只看该作者
本帖最后由 三月廿七 于 2011-08-19 13:29 编辑
怎么我觉得新语言能否持久 是个很大的问题 各种脚本语言那么多
坚持下来的有多少 一个java 一个c/c+= 还有 ...
Fatihyang 发表于 2011-08-19 11:43

c++ 在没落, 而c#确是在稳步上升...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
153 [报告]
发表于 2011-08-19 13:44 |只看该作者
回复 142# starwing83

关于宏与特殊表, 要说它们能实现为同一种机制, 我是同意的。 就像 symbol/string 底层用相同的机制。
但还是有一些很令人在意的区别:

1. 参数求值
宏是肯定全都不求值的,将求值的机会留给宏的计算过程, 或者宏的计算结果。
但特殊表, 可以说它全都不求值 —— elisp的实现是这样, 也可以说它部分求值。

(if c x y) 对c的求值, 在if求值之前或者之后, 都是说得通也可以这样实现的。
(progn x y z) 更是如此。

2. 两次求值
对if, 可以解释为根据c的结果返回 x 或者 y, 然后再对 x 或者 y 求值 —— 就像宏一样。
但也可以理解为 x 与 y 就在 if 内根据c求值了, 没有第2次求值过程。

对progn, 那更是可以当作普通函数对待。

3. macroexpand
宏可以只展开, 不求值。 特殊表可以吗? 至少elisp是不行的。
但是, 对"实现一种lisp, 它的特殊表可以展开" 这点我没意见。

4. primitive
再说 (if c x y), 如果实现为宏, 这个宏该怎么实现? 如何根据 c 的结果选择? 用cond吗?
那cond又如何用宏且不用if实现?

同理, progn 如果用宏实现, 再来个2次求值, 不单单是脱了裤子放屁的问题……
应该返回怎样的计算结果?  返回的结果应该包含什么, 才能让所有参数构成一个form, 才不会让 (if c (progn x y) z) 被解释为 (if c x y z) 啊……

所以, 不可能将所有特殊表全部实现为宏, 因为宏的计算本身就需要一些基础的机制, 它们就是特殊表。
那么特殊表与宏在使用语意而非实现方式上就有区别了: 特殊表是为了维持语言的完备, 而宏是增加(改变)语言的语法结构。

论坛徽章:
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
154 [报告]
发表于 2011-08-19 14:45 |只看该作者
回复 153# OwnWaterloo


    不能同意。

就比如,我问你,add函数是怎么实现的?*函数呢?那么你是不是得搞个“特殊函数”出来?而特殊函数和普通函数的唯一区别,可能就是特殊函数无法用纯Lisp写出来?

你所谓的特殊表也是这种东西,函数和宏只有一个区别:函数在调用前求值,而宏在调用前不求值,仅此而已,至于它能不能展开,能不能用纯Lisp去写——谁关心!而且,你可以认为函数是一种特殊的宏:它首先对所有参数求值,然后调用具体的lambda。我的意思是,宏(加特殊表)的含义就是不求值,没有别的东西,别的区别,那只是类似于“+无法用Lisp实现”这种纯粹实现意义上的区别。你不应该因为这个原因而抛弃了Lisp简洁的优雅。我不得不说,你已经Elisp中毒,而失去了传统Lisp的纯粹性了。

知道为什么我们用Lisp,不关心内存,不关心CPU?这就是抽象,Lisp的威力就是在于这个抽象。你还特意去区分特殊函数和普通函数,区分特殊表和普通宏,在意宏能不能展开(这里强调一下,Scheme明确说明宏就是特殊表,他们是一种类型:keyword,并且,标准Scheme没有任何办法去展开一个宏:它隐藏了这个细节),这就本末倒置了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
155 [报告]
发表于 2011-08-19 15:32 |只看该作者
回复 154# starwing83

1. + 与 * 的问题
它们确实不能由 lisp 实现, 但它们的求值方式没有特殊之处: 参数依次求值, 整个表只求值一次。

2. elisp中毒? macroexpand? 本末倒置?
macroexpand 不仅是elisp, 也是common lisp的东西。
elisp确实是个另类, common lisp 也是另类?
是你中了scheme的毒才对。

3. 纯粹性、 抽象这种什么有的没的理由
就像对"一切皆是对象"这种口号, 我一向不屑。  我可不喜欢先空想一个概念, 然后将所有事物都往这概念上硬套。 还函数是特殊宏呢……
就像我前面说 symbol/string 时提到的,  写C代码也可以完全不用类型去定义变量, 也可以不用结构体只用偏移, 反正都是内存, 没什么不同。

自上而下与自下而上就是你我的区别。

论坛徽章:
0
156 [报告]
发表于 2011-08-19 15:36 |只看该作者
回复 155# OwnWaterloo


自上而下和自下而上的区别在于:在下边堆shit还是在上边堆shit

中间路线就是在中间堆shit

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
157 [报告]
发表于 2011-08-19 15:45 |只看该作者
回复 156# reiase

嗯……    一开始编程, 就是一个产生shit的过程……  只是量的多少的问题……

论坛徽章:
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
158 [报告]
发表于 2011-08-19 16:51 |只看该作者
回复 155# OwnWaterloo


    1. 可笑,*和+无法用lisp实现,但是求值方式和普通函数相同,那么我能不能说define和progn也无法用lisp实现,但是求值方式和普通宏相同呢?你看到某个参数被特殊eval了就认为这一定是在调用eval的?什么逻辑,你用宏照样能做到一半eval一半不eval的效果,何必再添加复杂概念“某些特殊表支持一半eval一半不eval,而宏全部不eval”,请问这个复杂概念除了能搅乱思维,还有什么用处?

2. 我说的很清楚,能不能macroexpand和是macro还是special-form,没有关系,我举的例子是某个lisp方言(scheme),它就不能macroexpand,你不能想当然觉得不能macroexpand就不是参数不提前求值的某个“东西”了(这里我故意不用术语),macroexpand和参数不提前求值完全是两回事。这么说,Lisp的函数就是表,理论上你能打印出一个函数对应的表(比如(lambda (a b) (+ a b))就是某个函数对应的表,表有三项,第一项是lambda等等等等),但是你打出*和+对应的表看看?*和+是不能lambda-expand的函数,那照你的逻辑*和+就不是函数了?

3. 你过了。概念本身是有价值的。价值在于他有没有用,OO在组织代码方面有功,不管这个功来自ADT还是名字空间,你不能否认这点。你抨击的不是OO,是“一切都是OO”论。概念本身的简化有助于让概念有用。这里我简化了概念(Lisp只有special-form和normal-form之分,并不需要区分special-form、macro和lambda),这么说吧:

概念可以不存在,但概念如果存在,目的必须只有一个:让事情变得简单明了。

就算是从实现上来说(最近看TinyScheme),不区分所谓特殊表和宏也能让实现简单,何乐而不为呢(你真的希望在eval里面写一堆switch-case,然后再决定某个参数是不是不eval???)

你自己还口口声声说概念无用OO无必要不要发明没必要的概念,那你为什么又自己去创造复杂概念,去区分special-form和macro?这么做有什么好处?

论坛徽章:
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
159 [报告]
发表于 2011-08-19 16:55 |只看该作者
回复 157# OwnWaterloo


    Lua源代码你觉得漂亮吧?Lua源代码是不是shit?你觉得一个东西是shit通常有两个原因:它真的是shit,或者你是shit以至于看不懂它的

论坛徽章:
0
160 [报告]
发表于 2011-08-19 16:59 |只看该作者
回复  幻の上帝

1. 当真
2. 果然操蛋啊……  还可以这样……可以, 那呢?
又根据什么来判断下次是 ...
OwnWaterloo 发表于 2011-08-18 00:14


1.果然偷懒没翻原文容易阴沟里翻船233。。。想起来是拿GCC验证的时候我一时傻×直接-std=c89忘记-pedantic了。
2.

  1. for (char*p;int c=0,d=0;)
复制代码
这个是不行……
ISO C++03:
[Note: a for-init-statement ends with a semicolon. ]
6.5.3 The for statement [stmt.for]
1 The for statement
for ( for-init-statement conditionopt ; expressionopt ) statement
is equivalent to
{
    for-init-statement
    while ( condition ) {
        statement
        expression ;
    }
}
except that names declared in the for-init-statement are in the same declarative-region as those declared in
the condition, and except that a continue in statement (not enclosed in another iteration statement) will
execute expression before re-evaluating condition. [Note: Thus the first statement specifies initialization
for the loop; the condition (6.4) specifies a test, made before each iteration, such that the loop is exited
when the condition becomes false; the expression often specifies incrementing that is done after each
iteration. ]

Iteration statements一节没定义什么是condition。艹蛋的根源:

6.4 Selection statements [stmt.select]
1 Selection statements choose one of several flows of control.
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement
condition:
expression
type-specifier-seq declarator = assignment-expression
...
2 The rules for conditions apply both to selection-statements and to the for and while statements (6.5).
The declarator shall not specify a function or an array. The type-specifier-seq shall not contain typedef
and shall not declare a new class or enumeration.
把 = 硬编码到表达式以外的语法实在囧……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP