免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
181 [报告]
发表于 2011-08-19 18:06 |只看该作者
回复  OwnWaterloo
先说实现。我的观点就是特殊表和宏在使用上是没有区别的,在使用上,他们都是不对参数求值,由内部进行处理(至于内部是lisp是c是汇编我就不知道了),这算不算”使用方式“?是不是非要macroexpand才叫使用方式?好,就算是,假设我需要advising一个函数,我需要得到一个函数的函数体,然后去分析(这可是你说的!你说通过分析一个函数的表就可以得到函数的参数表,这比C++简单的多),但是你能得到*或者/的函数体么?你得不到,那你怎么去分析?如果你认为特殊表和宏在使用上有区别,那么你就必须承认原生函数和lisp函数在使用上有区别了。这在原理上是一样的,而且,就算是这样,这和“Lisp只有两种form,special-form和normal-form,前者在调用前不对参数求值,后者对参数分别求值再调用”这个论断完全没有关系:这个论断说明的是Lisp的form的分类和原理(也许在你看来是没用的东西),而不是教你怎么用special-form和normal-form,换言之,这句话根本就没提到使用方式,你这里提使用方式是什么意思呢?
starwing83 发表于 2011-08-19 17:43


141 楼, C++与elisp比较那部分, 我有说分析函数体吗, (lambda (a b) ... (f a b) ...) 这是在分析 f 的函数体吗?
我说分析函数体是什么时候? 是在166楼。   分析的是什么函数体?  是宏展开的结果
这就是宏与特殊表的区别之一 —— 宏的展开结果总是能在lisp层面获取到, 而不会像 + * 那样就得到C代码了。

你将我 166 楼说的分析宏展开结果 替换成141楼 分析函数体 来驳斥, 哥哥, 你太强大了……

回复  OwnWaterloo
再说shit。我想我们在什么是shit上有分歧。我觉得是由人导致的技术上的不美好(比如Windows和*nix的接口的差别,再比如各种实现限制,再比如写的很烂很不好维护的代码)才叫shit。我觉得Lua没有这方面的问题。所以Lua不算shit,Lua已经考虑到了现实编程中的无奈,Lua提出了解决方案,并且在你不接受这个方案时,提供预处理宏来将这些针对各个系统或者各个架构的琐碎的、不通用的代码从Lua的核心中去掉。这样我认为是很漂亮的处理。很干净,也很好维护,我认为这不是shit。

我不知道你是不是承认Lisp也有无奈,讽刺的是,一向反对无用概念的你,也只是崇尚概念上的的Lisp。我真的找不到一个实现得和Lua一样不带shit的Lisp实现。假设你不介意Lisp的实现很shit——就比如ELisp那充满了补丁的实现(这是你同意过的!),那么我只能假定你已经习惯能接受建构在shit上的,美好的东西。如果是这样,你为什么不去说明Lua概念一致的美,而非要纠结Lua实现的可能的shit?(况且我还不认为这些是shit),这算不算是双重标准?(允许Lisp实现得shit,只要结构好就成,但是不允许Lua实现得shit,即使语言上做了十分慎重的考虑?)
starwing83 发表于 2011-08-19 17:43


我对shit的定义与你对shit的定义不同。
编程就是在处理shit, 好的设计可以较少接触到shit, 差的设计远远的就能闻到。
准确定义差不多是 各种猥琐的细节与妥协
从 157 楼算起吧, 都是这个定义。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
182 [报告]
发表于 2011-08-19 18:12 |只看该作者
回复  OwnWaterloo
好,那么我想问问,请问Scheme是不是正统的Lisp?Scheme关于form(这是基本概念)的看法是不是正统Lisp对form的看法?
starwing83 发表于 2011-08-19 17:44


得, 我也俗气一点, 追求一下所谓的正统吧……
那common lisp算不算正统lisp? 如果算, 当需要解释 macroexpand 可以用于某些表却不能用于另一些表时, 应该怎么办?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
183 [报告]
发表于 2011-08-19 18:13 |只看该作者
回复  reiase

看不出来fork后能有这种问题。最后一次看APUE是半年前,能不能先科普我一下子进程会不会继 ...
starwing83 发表于 2011-08-19 18:06


会, 所有fd 都指向同一个文件结构, 里面记载着偏移量, 锁是同步锁, 并且是能锁从起始到无穷远的。。。。。。。所以看不出来了
但确实会有问题, mac 上验证 最终长度 58992, 1中间居然还有乱码

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


    我真的很佩服你了。我说的“分析函数体”是个比方,是说明你同样有可能分析不到函数体从而函数也会分两种。你一直对结论避而不谈。你敢不敢承认Lisp的函数实际上是有不同类型的???我举的不是你后来那个例子,我说的就是C++那个例子,如果*和/你根本就得不到其绑定的lambda对应的lisp代码,请问你怎么分析(lambda (a b)里面的a和b?你别咬住“函数体”三个字就不放行不?你也承认了*和/再展开就是C代码了,那么*和/和普通函数是不是一样?如果是一样为什么会有这样的区别?如果不是一样那你为什么不说Lisp有四种基本的form?

shit我不和你争。首先世界上肯定有美的东西。我不认为“编程本身就是shit”(这句话和你的原话“编程就是处理shit”有不同吗?)我觉得编程至少是有美好的东西的。注意,“有”美好的东西,意味着美好的东西总是占shit的百分比,如果这个比例是100%,我就认为它没有shit,或者放松一点(Lua内部实现也的确是有很细微的操蛋的地方,你必须得承认),如果有90%是美的,我就认为不是shit,所以我觉得lua不是shit。无论实现还是语言。shit的部分都没超过10%。

我的核心思想是:你不能因为一个form是C的还是lisp的就去区分它,无论这个form是special-form还是normal-form,Lisp美就美在它概念统一(程序==数据,万物皆表),你这样完全是背离Lisp精神的,你是被埋在肮脏的shit里面然后以为Lisp的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
185 [报告]
发表于 2011-08-19 18:19 |只看该作者
回复 183# zylthinking


    我似乎记得这个是个两次指向的,fd指向一个逐进程的file-struct,保存了文件的打开类型和pos什么的信息,file-struct指向实际的i-node,因此在fork之后,file-struct会被复制。所以file-pos不会共享。这么说是对的不?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
186 [报告]
发表于 2011-08-19 18:23 |只看该作者
本帖最后由 zylthinking 于 2011-08-19 18:28 编辑
回复  zylthinking


    我似乎记得这个是个两次指向的,fd指向一个逐进程的file-struct,保存了文件的 ...
starwing83 发表于 2011-08-19 18:19



你不用管那个二次指向了, 就便二次指向, pos也是位于第二个的; pos只有一份;
就算我理解错了, 人家好歹也在同步锁内来了一个lseek, 总不能说那个锁不能同步进程

靠, 还真可能是文件表问题; 记错了

论坛徽章:
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
187 [报告]
发表于 2011-08-19 18:28 |只看该作者
回复 186# zylthinking


    首先,我记得几乎所有的*nix的文件锁都是建议锁而不是强制锁,其次,这个锁了么……len是0啊哥哥……最后,锁了就有用?我记得APUE隐约提到锁对fork出来的子进程似乎有特殊的行为的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
188 [报告]
发表于 2011-08-19 18:29 |只看该作者
本帖最后由 zylthinking 于 2011-08-19 18:32 编辑
回复  zylthinking


    首先,我记得几乎所有的*nix的文件锁都是建议锁而不是强制锁,其次,这个锁了 ...
starwing83 发表于 2011-08-19 18:28


这个你就记不清楚了, 这个不但是强制性锁, 而且你所说的len = 0正是一个允许的语法
没有什么特殊行为, 至少我不知道

论坛徽章:
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
189 [报告]
发表于 2011-08-19 18:36 |只看该作者
回复 188# zylthinking


    = =||| 那除去索引边界错误的情况外,你怎么解释现象呢= =我现在在Win上,没法测试……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
190 [报告]
发表于 2011-08-19 18:39 |只看该作者
回复  OwnWaterloo
这个我的确没想到。修改一个宏的返回值这件事情在Scheme上本身是不必要的。Scheme采用模式匹配来自动地产生Lisp代码,它根本就不需要去处理某个宏产生的结果,因为所有宏产生的结果会被合并然后整体提供给最终代码。所以你说对了,我的确是没有做这种肮脏的事情的经验,那么请问,这种概念是优雅的吗?这种概念是Lisp整个语言体系必要的吗?这种概念,和这种概念带来的混乱和不可维护的代码(比如万一宏A修改了,宏B就完蛋了:因为它处理的表结构变了)真的是有益的吗?不是shit吗?
starwing83 发表于 2011-08-19 17:51


我给你举个例子。

一开始的版本
如果某宏扩展的结果满足:  (list (quote lambda) ... ) —— 即求值结果是 (lambda ...) , 就将扩展结果替换为 (function 求值结果) , 以触发编译。
使用这种新的backquote, 就需要满足一些新的规则, 比如 `(lambda ...) 就一定是意图作为函数传入, 如果想作为数据传入, 请写 `( 'lambda ... )

即使这样, 我也还是不太放心, 又将规则改为:
`(lambda ...) 保持不变, 如果想让 backquote 触发编译, 请写 `#'(lambda ...)
如果以前就有人故意写这种冗长的代码, 那就只好请他重写了 —— 百分之百的向后兼容本来就不可能。

1. 这种分析很难吗?
2. 这种代码很难维护吗?

你这就像没接触过指针的人对指针的恐惧一样。
那我问你, 对C/C++ 指针转换是必要的吗?  是shit吗? 会产生不可维护的代码吗?
其中的道理: 错不在机制, 而在用错的人


回复  OwnWaterloo
我说的是正统的Scheme没有macro-expand,但是几乎所有的发布版都带了这个标准外的函数,目的也无非就是调试,所以这一点Scheme并不差。但是,Scheme绝对不鼓励改变宏运行后产生的代码这种危险的行为。这种行为本身就和你得到一个指向未知对象的指针然后以为第四个字节的偏移位置就是长度然后瞎改一样危险。
starwing83 发表于 2011-08-19 17:51


不是肮脏吗? 为什么又要带?
上面也说了, 那些看上去危险的动作不一定就是错误。

同时 —— 既然带了这个标准外的函数 —— 那么它可以展开哪些? 又不能展开哪些? 如何解释其中的不同?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP