免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
141 [报告]
发表于 2011-08-19 00:48 |只看该作者
本帖最后由 OwnWaterloo 于 2011-08-19 01:06 编辑

回复 140# pandaiam

要传奇色彩, 要忽悠什么的, 找sw……  他比较八卦……

我觉得lisp最吸引人的就是: lisp的代码不仅仅是代码, 这些代码在读入之后, 是可由程序员操作的数据结构。
其他语言解析后肯定也有类似的解析结果, 但只会有限地暴露给程序员。
反正我是将这条标准作为是否是lisp方言的分界线。

因为程序是由数据结构表现, 而且数据结构不隐藏, 所以元编程能力与其他语言相比就不是一个层次上的东西。

举点例子吧。

C++编译器是肯定有实现typeof的, 因为sizeof首先需要typeof。
但C++03就是不将这一信息暴露给程序员。 然后就出现了各种猥琐且带有各种限制的typeof模拟……
直到C++0x,这一信息才终于暴露给程序员使用了。

lisp 就不会出现这种事情。 因为我只有elisp的编程经验, 所以只说elisp。
elisp不像C++那样可以自定义类型, 所以typeof只对内建的几种类型有效, 对比意义不大。

即使如此, elisp需要自定义类型时, 是这样模拟的:
(keymap ...) 这就是个keymap,  (0 0 [nil nil nil ...]) 就可以当作一个环形buffer使用。
也就是说, 这些信息对程序员是充分开放的。

而C++03里面搞死人的函数签名, 在lisp里面也是开放的:
(lambda (argument list) ... )
获取表的第2个元素就行了。


C++03里面, 要怎么获取一个函数类型? 返回值是什么?  每个参数分别是什么类型?
写个最简化的:

  1. template<typename F>
  2. struct signature;

  3. template<typename R>
  4. struct signature<R()> {
  5.     typedef R R;
  6. };

  7. template<typename R,typename P0>
  8. struct signature<R(P0)> {
  9.     typedef R R;
  10.     typedef P0 P0;
  11. };

  12. ...
复制代码
这完全就是体力活。  没有任何有效的技术能避免这种体力劳动, 除了直接扩展为文本的预处理器, 也就是宏。
boost有个pp库, 专门干这个事情, 但因为C/C++预处理器不是编程语言, 肯定就有很多限制, 比如循环结构根本就是假的……
无论如何, 这已经能再次体现其他语言与lisp元编程的不同了, 其他语言元编程的结果是程序文本, 而lisp的结果是数据结构

这还没完, 即使获取了函数的签名信息, 想转发一个函数依然没有有效的技术。  又得boost pp干活……  恶心到死……
直到C++0x引入了可变长模板, 这两问题才真正解决了……

而lisp里面, 想要转发一个函数 (fset 'f (lambda (a b) ...)) 简直就太容易了……
1. 获取参数列表(第2项) (a b)
2. 将这个参数列表作为新函数的参数列表。 新函数也是一个列表, 第1项是lambda, 第2项就是旧函数的参数列表
(lambda (a b)
3. "构造"转发"语句" 也是在操作列表, 第1项是函数名, 后面是参数:
(lambda (a b)
  (f a b)
4. 其他地方就任意发挥了, 想添加什么就添加什么。
(lambda (a b)
  ...
  (f a b)
  ... )

再也不用等着语言的下一个版本将那些不知道是因为什么原因而隐藏的元数据暴露给你。
再也不用等待语言的下一个版本添加新的特性。
C++0x等了多少年?  虽然是投票通过了, 还要等着发布, 还要等着编译器实现……
lisp里, 想要的数据, 想要的特性, 随时可以动手做……


而且, lisp另一个特点: 这东西真心不难啊……   语言本身简洁且一致。
除了将那些蛋疼的<></> &lt; &gt; 替换成括号, 这语法与xml有什么区别啊?
顺带还能执行, 而且50年代就出现了, 所以我才说sgml/html/xml都算逆发明, 反发明, 反文明。

语言的核心概念少得可怜(elisp info里面大部分都是与edit相关的东西):

1. 有个read过程, 将代码转换为数据, 然后是求值 eval
1.1 代码如何转换为数据由 read syntax 定义 —— 见elisp info
1.2 还有一些特殊的marker 比如 'a 读入后的结果是 (quote a) —— 见elisp info

2. 接下来是求值eval步骤: 所有数据求值方式都相同 —— 返回自身 —— 除了symbol与list(真正术语叫cons)。

3. symbol的求值结果就是 symbol 的 value cell —— 除了 symbol 是 list 第1项的情况外
3.1 symbol 在list的第1项时, 是取 function cell
实际的完整情况还要细分, 因为elisp实际上并不对list第1项求值 —— 见elisp info
3.2 但也有其他lisp表求值时第1项的求值方式与其他地方是相同的, 而且也没有 function/value cell之分, 比如scheme。
3.3 elisp 还有两类特殊的 const symbol, value cell 的值不会被改变。
一类的value cell 是symbol自身: t nil 以及所有冒号开头的 symbol
还有一类是语言常量, most-positive-fixnum 什么的。

4. list求值类似与函数调用, 第1项是函数, 求值方式如上所说, 见elisp info
4.1 其余项是参数, 依次求值并将结果作为实际参数传入 —— 除了特殊表与宏。
4.2 如果是特殊表, 不求值, 而是将read后的结果直接作为实际参数传入 —— 完整的特殊表列表见 elisp info
4.3 如果是宏, 也不对参数求值, 直接传递。
4.3.1 宏是这样一个东西: (macro (lambda (arg...))
4.3.2 表第1项是macro符号, 第2项是一个函数。
4.4.3 宏调用实际是将read的未求值的结果传递给后面那个函数, 并对该函数计算得到的结果再次求值

over……  语言就这么几条规则,只有几条例外但又必不可少的规则, 只有几处需要继续看elisp info获得完整信息。

千万不要乱找书看, 尤其是elisp的书。
大多数用elisp的都是程序员, 都是有其他语言的经验, 然后就套用在elisp上 —— 结果只能是胡扯。
比如programming in emacs lisp是把我害惨了的……  几乎就是elisp界的谭浩强了……

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


    你讲的太复杂了,什么特殊表啊宏啊,特殊表就是宏,他们是一个东西,说白了,函数是对所有参数后求值,然后直接执行函数体,而特殊表或者宏就是不对所有参数求值而是将参数直接传递给函数,然后由函数生成代码,再执行代码,即两次执行。搞那些有的没的特殊表啊宏啊搞毛……特殊表其实就是预定义的宏。

论坛徽章:
0
143 [报告]
发表于 2011-08-19 10:21 |只看该作者
。。。

不明白为啥这语言就新一代了。。。

论坛徽章:
0
144 [报告]
发表于 2011-08-19 11:39 |只看该作者
没有函数的声明语句??

函数名放哪,怎么实现代码重用的?

论坛徽章:
0
145 [报告]
发表于 2011-08-19 11:43 |只看该作者
怎么我觉得新语言能否持久 是个很大的问题 各种脚本语言那么多
坚持下来的有多少 一个java 一个c/c+= 还有什么去了
语言使用排行版  当年的c#那么火  现在也就那样

论坛徽章:
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
146 [报告]
发表于 2011-08-19 11:43 |只看该作者
回复 143# Kabie


    谁说是新“一代”了?我虽然比较娱乐点,但是这种操蛋的创造概念我也不屑的好不………………

论坛徽章:
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
147 [报告]
发表于 2011-08-19 11:44 |只看该作者
回复 144# rong_bo


    赋值啊,这么基础的都忘了?

add = (a, b) -> a + b
print add 1, 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
148 [报告]
发表于 2011-08-19 11:45 |只看该作者
回复 145# Fatihyang


    …………果然是个不懂行情的,我就不多说什么了。

论坛徽章:
0
149 [报告]
发表于 2011-08-19 11:48 |只看该作者
回复 148# starwing83


    确实不懂行  我坚持我的c c++ 其他语言也看下文档 学下 这种新语言 我懒得学 等能火的时候 再学习下

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
150 [报告]
发表于 2011-08-19 12:09 |只看该作者
看了点elisp的intro

就两个操作

'把表原封不动的返回
不带 ' 的表把第一个symbol当成一个function,后面的symbol作为这个function的参数执行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP