免费注册 查看新帖 |

Chinaunix

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

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

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

形象什么的是浮云……

平也灵最近的绯闻很凶残哦!

蜀黍居然是重庆的……

论坛徽章:
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
42 [报告]
发表于 2011-08-17 09:03 |只看该作者
歪楼了歪楼了!!!


实际上,本帖是在讨论两个话题:首先,MoonScript 这种新语言的实现方式(一对一地翻译成 Lua)我觉得是很值得借鉴的。包括CoffeeScript也是这个原理。理论上,因为Lua的类型系统的一致性,甚至可以将Lisp一对一地翻译成Lua,这应该并不困难(Lua支持尾递归优化),唯一问题是嵌套函数的开销问题,当然这个在Lua5.2里有所缓解,当发现函数未使用upvalue的时候,将其放在外层也是很好的选择。

第二个话题是MoonScript本身的语法设计。抛开Lisp这个怪胎不谈。我们只讨论MoonScript在非Lisp语法体系中的感觉。Moon借鉴了Python的缩进、Ruby的无括号访问、Haskell的函数声明和一切皆表达式的特性。我觉得是值得肯定的。大家可以围绕这两点讨论~

不要再歪楼了!!!

论坛徽章:
0
43 [报告]
发表于 2011-08-17 09:21 |只看该作者
看到《那花》我果断滚进来留名了。。

评分

参与人数 1可用积分 +2 收起 理由
OwnWaterloo + 2 握爪~

查看全部评分

论坛徽章:
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
44 [报告]
发表于 2011-08-17 09:59 |只看该作者
回复 43# nth2say

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
45 [报告]
发表于 2011-08-17 10:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
46 [报告]
发表于 2011-08-17 10:31 |只看该作者
回复 45# pmerofc


    C语言本质上是命令式语言,区别在于他用结构去表示命令。我们先来看看纯粹命令式语言BASIC。BASIC语言由多行语句组成,每行语句的结构是:

命令名 {命令参数}

比如说:
LET I = 10
其中LET就是命令名,而I=10是命令参数。

后期的Basic还有C语言都淡化了这一点,它们将一个结构当成了命令,给予其含义:
if (expr) block {else block}

这样的一个结构被称为一个语句,语句实际上就是命令,只是将简单的命令名(如LET,IF)替换成了一个复杂的结构,以增加其表意能力。

而MoonScript虽然也是以结构主导的,但是它有个特点,这个特点是C不具备的:所有结构都有返回值。

什么意思呢?在C语言里面,有些结构(确切地说,除了表达式外的所有结构都)是没有返回值的,C语言规定只有表达式才能够计算出值和对应类型。而MoonScript里面,所有的结构都有返回值,比如说:

a = if 1 == 1 then 2 else 3

if ... then ... else 是个结构,然而这个结构在执行的时候,其最后一个被执行的语句(或者2,或者3)被当作了这整个if语句的返回值被返回,然后赋值给a了。

再比如:

a = for x = 1, 10 if x % 2 == 0 then x

for 语句也有返回值,返回值是for语句的循环体的返回值的数组(nil被忽略),所以上述语句将a赋值为数组[2,4,6,8]

有了语句返回值,语句和表达式的界限被模糊了,语句也可以被当作表达式,事实上语句就是特殊结构的表达式,这一点和Lisp是相通地(Lisp分为special-form和normal-form,后者是简单函数调用,前者就是语句的等价物),而因为Lisp的语法特性,所以我才说这个特性是从Haskell语言(另外一个函数语言)学来的。这是函数式语言的核心特征(万物皆表达式)。

MoonScript实际上可以认为是亲民版的Lisp,它拥抱了相对正常的语法,失去了Lisp能够操作代码的能力,可谓有得有失。至于得失如何,我觉得后人可以评论。

论坛徽章:
0
47 [报告]
发表于 2011-08-17 10:35 |只看该作者
回复 42# starwing83


没记错的话,已经有将js作为后端的编译器出现了

MoonScript怎么翻译到lua呢?
通过宏语言转换还是通过AST来生成

论坛徽章:
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
48 [报告]
发表于 2011-08-17 10:50 |只看该作者
回复 47# reiase


    答对了,你说的就是CoffeeScript。MoonScript大量地借鉴了CoffeeScript,无论是语法还是生成机制。MoonScript是通过将源代码解析成AST做到这一点的。CoffeeScript就不知道了~~~

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
49 [报告]
发表于 2011-08-17 10:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
50 [报告]
发表于 2011-08-17 11:34 |只看该作者
{:3_195:}{:3_195:}为什么看来那么久,什么也不懂,就C比较熟悉;看来在原有的语言上多学点知识,是很重要的,不然连混论坛都是囧态。{:3_201:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP