免费注册 查看新帖 |

Chinaunix

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

[C] Lua 造成的代码冗余太严重了, 这个现状怎么改善? [复制链接]

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

1. 你自己看清楚没?这两个表述有什么区别?Lua的强制除了报错还有什么?

2. 我已经说的很明白了:除非文档说明,否则除了模块的名字,其他子模块都是私有的。不明白?

C++的class不写存取权限符,就是默认private,不明白?

C的char*不主动给它赋值一块合法内存,其值就是未初始化的,不明白?


我最原始的问题是"如何避免无意间",如何"有一种方式让库的作者让库的用户知道"。 而且也列举了各种方式, 从最强最弱。
"强制"是你加的。

我 —— 直到现在都 —— 没看到你夹杂在各种"哲学"里的"除了模块名字,其他子模块都是私有的"的描述。
后来你单独说出来了。 这没看到, 算我的错。
现在我知道了 —— 我相信在lua方面你还是不会随口打哈哈 ——  如果写个stm.lua, 然后不加其他说明, 用户require stm.atomic就是他自己活该。 谢谢!

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

>> 你藐视Haskell正统,所以还在静态的时空分析的深渊里面挣扎。

喂,别走啊。至少走之前教教我正统的Haskell该怎么做时空分析啊。我还挣扎着呢,拉兄弟一把啊。

论坛徽章:
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
73 [报告]
发表于 2012-11-18 18:39 |只看该作者
OwnWaterloo 发表于 2012-11-18 17:00
"lua做得不够多" -> "lua官方做的不够多" -> "官方不做"

你这是迫害妄想症?


第一条是你一直在提的(没有标准异常机制(QQ里);没有合理的REPL机制(我始终没明白你说的reload是啥含义,看来不是dump二进制了,那是dump什么?dump history么?我能在Vim里面ddp交换两行,能dd10p复制粘贴十行,能一次产生一个很漂亮的代码表格,repl可以?;没有支持相对路径的模块机制;还有别的什么没?);第二条是你自己提的(标准异常机制?有啊,luasocket的newtry+protect。你是怎么说的?“不是官方的”“不兼容”是吧?);第三条你自己承认了?

麻烦你看明白行吗?Lua的模块载入是上下文无关的。是独立的。意思是这样的:

require "..foo"

这一行语句本身,并不会额外带其他的信息——这只是普通的语句而已。因此,如果写着这一行语句的文件——可能是个普通lua文件,可能是个zip包,可能是个mpk文件(我们以前的私有打包格式),可能是在一个.c文件内部,甚至可能是一个独立的.o文件(LuaJIT支持)——不附带某些指向文件格式的信息,那么就根本无法推导..到底是什么。我们假设是个zip包吧。你想想看实现,require得从某个地方知道当前文件到底在哪儿,假设我很好心的给出了一个这样的路径:

zip://c:/data.zip/main.lua

那么也得有个东西能读取这个东西啊!现在的问题来了,如果require要从多个loader载入模块呢?那么这些loader就必须协商出一套能够在所有loader之间表述1.该文件是由哪个loader载入的;2.该如何查找他的相对路径模块文件。这种机制,除了官方指定,又怎么兼容?但是这种东西,明显是不会有任何语言会做的,那么实际上能做到的事情就只有两个了:1.不支持任意loader,只能由官方决定文件从几个有限的地方载入(如Java),这样你估计更有意见了;2.只支持文件路径相对载入,其他的就不管了,这样的后果是可能导致Bug(如果载入的几个地方都是?,持续往上找的结果可能是错误的)。这两者都是不完美的。所以Lua没有做任何限制——有本事,你自己做一套机制出来,反正材料都给你了。随便你。

但是,换一个角度思考这个问题——啊,我知道,你肯定又要选择性失明了,但是慢慢看,免得等会儿又无理取闹——从构架上来说,要求所有的库在一个目录下,要求这些库有清晰的相对关系,要求载入是明确的,这究竟有多么困难?就非要相对路径载入?就非要偷偷摸摸载入几个文件然后让谁也不知道?你说闭包能隐藏数据,可是那些数据是大白于天下的,是在文件里面的,是谁打开都能看得到的。数据的内容是隐藏的而其结构是完全看得见的。这难道不和公开载入模块完全相似么?(注意,模块的结构是完全公开的,但是模块内部干了什么事情是被隐藏的)

我知道你想说什么:“我就是有这种需求,你咋地?我就是不想遵循这个规则,你咋地?我就是想要相对载入文件我就认为这个好,你咋地?”那就直接没什么好谈了。语言是妥协的产物,Lua就是不这样,而你非要这样。我说了你能自己实现,你又嫌这种实现会有各种各样的问题,那我有什么办法?

下面一个回复:你咋就知道我被限制死了?你怎么就不觉得你自己太过天马行空不考虑实际开发的需要?在大学里面,人家WordPress几个小时交个单子你就继续研究你的Clojure?你难道不是被你的那些条条框框那些所谓美感给限制死了?说难听点叫“思维固化”,说好听点叫“执着坚持”。拜托别玩这种文字游戏好吗?

最后一个回复:我用repl的经验一直很糟糕。因为你不是Vimer你体会不到。Vim的文件编辑是立体的,是跳脱的。在repl我感觉自己就被限制住了。我打个比方吧。GW-BASIC,以前在文曲星,甚至学习机上经常玩。现在看来实在是很操蛋。但是那种“操蛋”的REPL就是立体的,比如说这样:

list
10 print "hello"
OK

然后,你将光标挪到10那一行,把10改成20,回车,然后程序就变成了2行!明白吗?是很灵活的可以对屏幕上任意文本进行修改并且执行的。我可以很快的在Vim里面产生一个几行的表格,我可以随时看到语法高亮的结果,我可以不写括号,而等到写完以后统一加上,然而在repl里面,我感觉所有的高级功能,那些跳跃,那些preview都离我而去了,我只能想在Emacs里面那样,老老实实地敲代码,f功能没了,*功能,#功能,d,p,c,v这些都没了,你明白么?



继续下一个帖子:

OwnWaterloo 发表于 2012-11-18 17:17
因为lua有个模块叫pluto,所以repl的persistent是指dump? 你看你是不是又被lua的经验蒙蔽了?
云风又怎样了? 他那个实现dump出来的东西是人可读的? 他要把这做出来了, 也有值得我追捧的点了。


你嘲笑我好了, py, el, haskell, clojure都做不到(或者我不知道如何做)dump出内存状态。
而且我也不知道dump出来了有什么用。 又关我什么事?

是什么原因让你变得这么不自信了? 一提到关于lua的事,就非要得出"lua是可以做到的","lua有很多优美的解决方案","不然就是需求的错"的结论不可?
是因为你自己已经卖给lua了吗? 于是lua有什么疑似短板就让你很焦急?


我完全不理解repl所谓persistent,看来你也不打算科普了。事实上我从没用到过repl的persistent的能力。我也不知道reload到底是什么含义,当然你也不打算解释了。所以你就是来秀你的优越感的?

那是,我也不知道所谓的基于repl的开发,而不是基于edit-compile-eval的开发到底有啥优越感可言,你嘲笑我好了。我就只会edit-compile-eval。对我来说这真的好不方便好难啊,我得按gc才能执行正在编辑的文件呢!

你也学会给我安上这种态度了?我什么时候不自信了?你哪只眼睛看到我不自信了?有缺陷做不到的本来就是做不到的,难道我没有说明这一点?看看你的逻辑吧:

Lua做得到 - 但是它不是官方的!(针对异常机制)
Lua做不到,但是这种想法本身就是有缺陷 - 你看看,就是做不到吧?有缺陷?我咋看不出来?(针对相对模块载入)
Lua做得到,官方也兼容,但是这没多大意义 - 有没有意义你说了算?Roberto说了算?天王老子说了算?我就说有意义。
Lua做不到,不过你可以用Lua的方式来组织/设计 - 哈哈哈你承认做不到了吧?做不到就是搓!

这啥逻辑?你这除了让我承认“哎呀Lua好搓啊,哎呀我咋就用这么挫的东西写了这么久的代码捏?”?是不是我承认以后你还得加一句“是啊是啊,你看你多搓,你看你的思维全被Lua给限制住了!!赶紧皈依我佛吧!”,这算啥?

下面的三个帖子我就不想回了。实在是太乱了,基本上有些观点上面也已经提出了。估计你也看得出来。实际思想其实很简单:

- Lua本身先不管做不做得到了,这货很简单粗暴,所以也没那么多好争的。语法上的灵活性导致几乎所有想法都能做到,如果你要争论是否是官方的是否是约定俗成的那我也没办法。
- 我并不认为追求简单就是在固步自封。我就是不喜欢上百M的编译器。
- repl我用过,但是感觉没有在editor里面那么灵活,你也是windows,你怎么能闭着眼睛说瞎话呢?当一个函数很长,长到了prompt要显示PS2的时候,万一你打错了,回车的结果是error的后果是什么?是一行一行翻过去重新按回车,然后把错的地方改对!那我为什么不能在editor里面一次改对,然后执行呢?这样不是更快么?clojure的repl我就遇到过这种痛苦事儿,写fac写了三行,一按回车给了个错,然后我发现某括号没对准,于是我翻到第一行,回车,翻到第二行,回车,翻到第三行,光标移动到最后,加),回车,好了,在Vim里面我早就在试验第三种写法了!!
- 别有事没事给人扣帽子。别人说不是这个东西的错,就是固步自封?非要让别人说这个东西不好这个东西不对这个东西生来就是错?你这叫啥来着?

就是这样。





论坛徽章:
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
74 [报告]
发表于 2012-11-18 18:44 |只看该作者
回复 72# OwnWaterloo


    我又不知道这个,当初学到这里的时候昏头昏脑已经完全晕了,我说过我印过一本Haskell 98 report吧?

Haskell你肯定比我熟,但是你用起来是不是也太非主流一点了?(上次Q里面你说arrow还没看,在看啥啥啥之前不敢看云云)反正你C++就很非主流了。上次是你给我看的还是我给你看的?那个phoenix模块。类似于C++里面手写解释器啥的。另外最近在看agg,正统的C++模板库用法——我承认里面很暧昧不清,但是等到我用C来实现里面的算法的时候才发现,如果考虑效率问题的话,用C基本上没法赢那个模块。甚至用C++-without-class都不行……那货用class做functor再参与template实例演变,最终导致的结果是流水线式的操作被整体实例化成一个独立函数参与优化,这点C完全做不到。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
75 [报告]
发表于 2012-11-18 18:48 |只看该作者
starwing83 发表于 2012-11-18 18:39
第一条是你一直在提的(没有标准异常机制(QQ里);没有合理的REPL机制(我始终没明白你说的reload是啥含义,看来不是dump二进制了,那是dump什么?dump history么?我能在Vim里面ddp交换两行,能dd10p复制粘贴十行,能一次产生一个很漂亮的代码表格,repl可以?;没有支持相对路径的模块机制;还有别的什么没?);第二条是你自己提的(标准异常机制?有啊,luasocket的newtry+protect。你是怎么说的?“不是官方的”“不兼容”是吧?);第三条你自己承认了?


这个我在QQ里确实提过。
以前的结论 —— 至少我认为的部分 —— lua依然没有好的方案。 newtry不过是在nonlocal jump与status code之间不断地切换
在lua社区里,你要将这个叫做异常,那就叫做异常好了。
就好像很多语言支持了first class function也就说自己是functional programming language一样,有dynamic environment就说自己可以meta programming了一样。
人家的社区,爱怎么叫就怎么叫。 但是怎么回事就是怎么回事, 叫得再好听也没用。

论坛徽章:
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
76 [报告]
发表于 2012-11-18 18:58 |只看该作者
回复 75# OwnWaterloo


    异常本身,难道不就是nonlocal-jump以及jump之后的对应资源清理么?

所谓对应资源清理,newtry难道做不到么?protect难道做不到么?本地跳转和状态转换背后是什么呢?

再科普一下吧。

假设一个lua函数会扔异常,那么用protect,就会保证它不扔异常了,而是返回nil+errmsg算错误。
假设一个lua函数返回nil+errmsg算错误,那么用assert,它就会(在这里)扔异常。

这两者是异常和状态码(如果你非要这么认为的话)的转换。

那么,异常的精髓之一,错误传递,OK了。精髓之二——在异常出现时,所有的资源保证得到释放——怎么办?

这是newtry的工作。newtry产生一个新的try函数,该try函数附带一个finally块,保证某个操作一定会执行。

因为assert是标准库函数,所以newtry+assert+protect的构架才被称为newtry+protect。

貌似在QQ里面你不是现在的说法吧?你承认了这个机制可以完全实现异常的所有特征吧?你那个时候的说法,是这套机制不是标准机制,所以可能有人用其他的方式去扔异常然后这套机制就完蛋了吧?是说的Lua社区没有对这套机制进行标准化吧?

我好像那个时候就说了,虽然接受异常的方式没有标准化(太多了),但是产生异常的throw是标准化的吧?所以实际上没有兼容性问题,这和模块系统实质上是一致的吧?(载入模块的方式没有标准化,但是模块的书写规则被标准化了,所以无论你怎么写载入模块机制,最终的结果都是兼容的)

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
77 [报告]
发表于 2012-11-18 19:19 |只看该作者
我的神诶,俺竟然错过了这等好贴{:3_184:}

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

我又不知道这个,当初学到这里的时候昏头昏脑已经完全晕了,我说过我印过一本Haskell 98 report吧?

Haskell你肯定比我熟,但是你用起来是不是也太非主流一点了?(上次Q里面你说arrow还没看,在看啥啥啥之前不敢看云云)反正你C++就很非主流了。上次是你给我看的还是我给你看的?那个phoenix模块。类似于C++里面手写解释器啥的。另外最近在看agg,正统的C++模板库用法——我承认里面很暧昧不清,但是等到我用C来实现里面的算法的时候才发现,如果考虑效率问题的话,用C基本上没法赢那个模块。甚至用C++-without-class都不行……那货用class做functor再参与template实例演变,最终导致的结果是流水线式的操作被整体实例化成一个独立函数参与优化,这点C完全做不到。


arrow不只是上次,我到现在都没看。这与不正统以及时空效率是什么关系?
我现在接触到的最大的库就是yesod,没见里面用arrow啊。

Haskell,以及SML那一系列的函数式编程社区里有无数的无数的概念。如果脱离实际应用直接去研究那些概念,我没那个本事。
http://www.haskellers.com/skills 这么多,总得有个先后吧?
就好比一个研究OO的,说他今天知道了XX模式,明天知道了YY模式。 如果不知道这些模式解决的问题, 光研究模式又有什么意义?

而且还有一点。如果要和C++对应的话,arrow大致就是C++中的一个具体的interface。
没有具体的implementations, 光研究interface有什么用?
就像file, 它支持open, close, read, write。 就完了啊, 没什么可以继续研究的了啊。
但要真正理解这个interface, 得知道它可以操作磁盘、内存、socket...   这才有了意思。
arrow没有接触到这样的具体应用, 唯一接触到的就是function。

我个人觉得自己不正统的地方就是不用cabal。。。
类似的,在clojure里不用lein。。。

之前说用lein,也是在工作室用。。。 自己家里的机器上没装。
还包括heroku的命令行工具(其实就是一些ruby程序),也没装。 因为我发现只要把ssh key用命令行工具上传(没有找到web界面),以及create之后就可以不用heroku的命令行工具了。
剩下的就是git clone和git push(用已经上传的ssh key)。
所以才会弄一个neval.htm, 因为我在家里不想装heroku, 不然它有通过ssh的remote eval的。

但这种洁癖。。。 你也有吧。。。



纳尼? 你后面说的C++的这种用法, 是正统C++? 你觉得说出去有多少C++程序员会信?要这么说, 我都是正统C++程序员了。
C++就是面向对象的C —— 有多少C++程序员不是这么想的?
是否正统不是由你个人的感觉说了算的。 但代码该怎么写, 是可以由你说了算的。
只要你能确认没有更好的方案了, 就这么写, 该是模板就是模板, 该是class就是class。
如果你要去顾及那种"哎哟,你这么模板好复杂,我看不懂哟"的人, 这种人是没有下限的, 他们最终会将你拉到只有C(甚至C都不如的层次) 那你还是什么都不要写算了。。。
正统的定义会随着时间、人群改变的, 假设我写模板, 在我们两人看来很正统。 发布出去后被大多数人认为不正统。 这个正统你还追求么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
79 [报告]
发表于 2012-11-18 19:39 |只看该作者
starwing83 发表于 2012-11-18 18:39
下面一个回复:你咋就知道我被限制死了?你怎么就不觉得你自己太过天马行空不考虑实际开发的需要?在大学里面,人家WordPress几个小时交个单子你就继续研究你的Clojure?你难道不是被你的那些条条框框那些所谓美感给限制死了?说难听点叫“思维固化”,说好听点叫“执着坚持”。拜托别玩这种文字游戏好吗?


怀疑我在做"wordpress定制"这样的工作时,是谁在劝我离职? 说这没前途? 那我现在就去做wordpress定制, 你又觉得如何?
这不也是你的坚持? 你又能忍受现在web像坨屎一样的状态?

损人一千自伤八百,有你这么找论据的么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
80 [报告]
发表于 2012-11-18 19:44 |只看该作者
starwing83 发表于 2012-11-18 18:39
你也学会给我安上这种态度了?我什么时候不自信了?你哪只眼睛看到我不自信了?有缺陷做不到的本来就是做不到的,难道我没有说明这一点?看看你的逻辑吧:

Lua做得到 - 但是它不是官方的!(针对异常机制)
Lua做不到,但是这种想法本身就是有缺陷 - 你看看,就是做不到吧?有缺陷?我咋看不出来?(针对相对模块载入)
Lua做得到,官方也兼容,但是这没多大意义 - 有没有意义你说了算?Roberto说了算?天王老子说了算?我就说有意义。
Lua做不到,不过你可以用Lua的方式来组织/设计 - 哈哈哈你承认做不到了吧?做不到就是搓!


你这说的是我在QQ里,对newtry的那系列讨论? 除此之外还有没有? 比如这个帖子里?
而且要newtry就newtry,要在nonlocal与status code之间切换就切换。 能不能别这么不要脸说这是异常处理? 哪家异常处理是这样的?
当然, 这种事情见多了也就习惯了。 我现在也不纠结这到底叫不叫异常处理了, 随便你们(lua社区的人)怎么说。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP