免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
51 [报告]
发表于 2012-11-18 15:55 |只看该作者
本帖最后由 starwing83 于 2012-11-18 15:56 编辑

回复 50# OwnWaterloo

名字冲突不会。好的模块仅仅声明局部的东西,并不改变全局,只是最后返回一个包含所有导出函数的表而已。退一万步说,你要真是怕,你就直接dofile传一个environment过去,最简单的沙盒。

那你还要怎么说?你就非要语言给个大大的error你就爽了?跟你说别人没导出的文件你不要用难道就这么困难?你有强迫症么?
   
是不是每次写C的时候你都要-Werror你才爽?哦,对了,你不写C的。

顺便说一下,作为脚本,从旧版本里面拷贝一个出来这事儿我做过好多遍了…………主要是那个pretty_print,自己写一个烦,又是自己一个模块的私有部分,所以每次真的要用就直接拷……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
52 [报告]
发表于 2012-11-18 16:04 |只看该作者
starwing83 发表于 2012-11-18 15:43
你喝醉酒了?你看清楚条件行不行?我还刚刚好给高亮过了你还没看见?不是说支持私有模块可笑,也不是说对载入私有模块给错误可笑。是说在一门“连参数数量和变量声明初始值都不会做报错处理”的语言中,“让载入私有模块报错”是很可笑的事情,麻烦你看清楚前提,好吗?

是你自己没有说清楚前提。 你敢不敢承认你高亮的部分很多在原帖里都是没有的?


starwing83 发表于 2012-11-18 15:43
顺便回上一个帖子没提到的部分,dofile依然没有解决报错的问题。dofile你自己可以do,但是你依然不会妨碍到别人天真地require,除非你改个扩展名,叫stm/atomic.private好了,你不觉得这样解决问题很自欺欺人么?但是,如果你不改后缀名,人家照样可以require 'stm.atomic',就算你自己dofile了也是这样!

不能妨碍别人require?
我本来就不愿意强制别人一定不能加载什么。 最理想的情况是读了代码而非注释就知道那些东西不应该自己去require。 但lua看起来没有这样的约定习俗。

至于要妨碍别人require, 我前面说过妨碍的方法了。
只是你心里想的就是"嗯,lua肯定没错,肯定是这些家伙的需求不合理,乱用"。 根本就听不进去而已。
你是来为lua辩护而不是来讨论的, 所以我也懒得给你找了。


starwing83 发表于 2012-11-18 15:43
再回一下,对Lua来说repl就不是官方考虑的内容!很多人都考虑过repl,甚至有过好多个实现(我知道的就有四五个)。但这不代表这就必须是官方考虑的内容了。说实话,我根本就没看懂你说的reload是什么含义。但是,不管如何,你到底是在使用Lua,还是站在clojure的制高点上嘲笑Lua?——哦,其实你根本就没用也没打算用Lua,对不对?这和站在路边嘲笑给乞丐扔钱的人有啥区别?


说repl, 还是围绕着相对路径在说。如果支持相对路径, 那很多问题都会更简单一些, 比如repl中的reload不需要管理dependences。

不过既然你都说到这份上了, 我还就是站在clojure的制高点上嘲笑lua。 还不只是clojure, 还包括python, elisp, 甚至还有haskell这种这么静态的语言。

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

加载lua文件总是要先打开吧? 将当前打开的文件存放到栈里, 遇见dofile并且是相对路径就是相对栈顶文件?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
54 [报告]
发表于 2012-11-18 16:10 |只看该作者
starwing83 发表于 2012-11-18 15:47
可是我有这样的需求,不好意思。你尊重我的需求么?你的态度和上次我说你的需求无理取闹有何区别?


我是问:
1. 有没有正统的方式达成我的需求
2. 如果没有,那有没有不正统的方式让我达成我的需求

我没让你跟着我一样这么不正统地写啊。

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

那些程序本身就跟Lua无关。

想要wildcard?自己用lfs去,Lua本身的确与wildcard无关,这就是事实。

dofile也不支持wildcard的,Lua没有任何一个部分支持wildcard,除非你自己写,这就是事实。

到底是谁喝醉了?

  1. lib/init
  2. lib/plugin/
复制代码
的重点在相对路径而不是wildcard的责任归谁。


如果你还没明白,还要继续纠结wildcard。。。  我给你说个不用wildcard的例子可以了吗?

  1. lib/convert
  2. lib/decode/mp3
  3. lib/decode/flac
复制代码
从各种音频格式解码到wav。 convert会判断音频的格式(从后缀名或者magic number),然后载入decode中对应的插件。
不用wildcard了。。。

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


    好,你说我加了很多东西,我贴原话!你应该满意了吧?

starwing83 发表于 2012-11-18 09:45
特别的,在Lua这种连参数数目都不强制,连变量声明都不强制的语言里面,你去强制不允许载入某些模块,你不觉得很可笑么?



看清楚了?

很奇怪的事情是,1+1=2有什么好辩论的。你的观点无非就是“Lua做的不够多”,OK,我举例子说有人做了,你的观点就成了“Lua官方做的不够多”,然后你自己还引了一段话说明“官方就是不做”,你这样让我怎么办?是不是要我说“55555Lua你怎么这样啊,这简直就是上帝都救不了你啊!因为上帝不是Lua的作者啊!!他无权改变什么啊!!算了,我自己写个语言吧,就叫OWLua好了,我就是作者,我能做很多”,这样?

这是抱怨,对不对?不能解决任何问题,对不对?能解决问题的方案,我贴的还不够多么?甚至连Lua对模块的要求很低,只要返回导出函数的表即可,因此任何的模块系统的实现,都能兼容现在所有的模块。你还要我说什么?是不是还要说“可是官方不支持啊”。那你还要我怎么办?发明一个新语言?一个和Lua的区别仅仅是官方支持模块载入的新语言么?

问题是,这里面提到的,基本上100%都不是语言的问题,不是语言“做不到这个做不到那个”,而是说那种东西有先天的缺陷,语言做到这个本身是有问题的(如相对载入——那个相对的文件本身可能自己根本就不是文件);而有些是语言能做得到,但是不是标准的;最坏的情况是你得自己做;还有什么是做不到的?

哦,Repl然后dump state这个估计有困难,但是依然做得到,有个模块叫Pluto——当然是官方的!我想问问,你自己的发言:

OwnWaterloo 发表于 2012-11-18 16:04
不过既然你都说到这份上了, 我还就是站在clojure的制高点上嘲笑lua。 还不只是clojure, 还包括python, elisp, 甚至还有haskell这种这么静态的语言。


clojure可以dump repl的当前状态?Python可以?Elisp可以???Haskell可以??我怎么一个都没听说过呢?这就是你嘲笑的方式么?为其他语言装上他们根本就不具备的功能,然后说Lua没有这个功能?看过云风写的文章么?他做到了将Lua持久化(采用客制化内存分配器的方式),以及将Lua状态共享(同样的方案)的方法,clojure做个看看?JVM可以客制化内存分配器?别逗了。

而且还说了,你真想dump——我就听说过matlib有这个功能,可以直接dump,有人好像就因为引用没清干净dump一个函数dump出来200M的文件——的话,有Pluto,你以为Lua就真做不到?

好,现在轮到我来嘲笑你了,Python怎么做到这个?

$ python
>>> import db
>>> d = db.connect("mydb.myserver.com", 12345)
>>> import dump from repl
>>> dump("reload.py")
>>> exit()

$ python --load reload.py
>>> d.execute("select * from table")
ID NAME
1  ABC
2  DEF
>>>

Python做得到这个吗?

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

顺便说一下,我完全不知道你这个回帖想说明什么,或者在说明什么。我从来没有见到过你说的这种工作流——在repl里面一点一点敲代码,然后dump到文件里面去?实在没见过。所以更别说你说的reload是什么意思了。完全不理解。


我不知道你强调一点一点敲代码是出于什么目的。 难道你在文件里就是不是一点一点敲出来的,而是copy paste的?
哦,你理解的repl是必须在终端里运行的? 那就难怪了。

不理解就算了,我就记得我顺带说过一句什么话,往前一翻,果然:
OwnWaterloo 发表于 2012-11-18 15:20
BTW: 我只是顺带提一下。 lua是不是支持对我来说完全无所谓。 反正我目前又不用lua。

论坛徽章:
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
58 [报告]
发表于 2012-11-18 16:22 |只看该作者
本帖最后由 starwing83 于 2012-11-18 16:23 编辑

回复 53# OwnWaterloo


    不一定是打开的,是可以在C源代码里面直接loadBuffer的,你如果真的开发过Lua甚至是Python你就会发现,有些时候异常给出的dump stack有些项是问号,就是因为在C源代码里面干活根本取不到文件名。

另一个例子:Lua(甚至是Python)都支持不同的载入器,可能那个”文件“根本不是物理文件。而是,比如说,zip里面的某个文件。这种情况下的”相对载入“就必须提供在任何载入器上都兼容的uri表示方式——你不觉得这个很扯么?

甚至连Java都不支持相对载入,必须设置CLASS_PATH。Android的ClassLoader本身还有点暧昧不清的问题,网上文章一把一把的。

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


    哦?所以你的论点就转为嘲讽我Vim无法开repl了?你Emacs的repl模式威武牛逼?你是不是还得说,”Clojure鄙视所有用Vim的人!Emacs威武牛逼可以REPL!”这样?套用你的句型,连Clojure自己都没有锁REPL是自己的卖点吧?你有什么资格站在clojure的角度嘲笑Lua?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
60 [报告]
发表于 2012-11-18 16:34 |只看该作者
starwing83 发表于 2012-11-18 15:55
那你还要怎么说?你就非要语言给个大大的error你就爽了?跟你说别人没导出的文件你不要用难道就这么困难?你有强迫症么?


你怎么知道哪些文件是别人导出的,哪些是不导出的?

stm.lua里require stm.atomic,你凭什么知道stm.atomic是不是打算暴露给你用的?

如果没有其他方式告知这件事,注释/文档也勉强凑合。
但问题是有些库作者不注重这点,他可能就忽略了告之用户哪些子模块是他不打算维护稳定性的。

而且这问题还不一发生在你引用某个库,然后库升级了,这个层面上。
也许你会很小心, 但你使用的库的作者对其他库可能就没这么小心。 让后那个被间接依赖的库一升级, 最终影响到的还是自己。


OO难得的贡献之一就是将私有/公有的概念推广了(这里不说发明,不知道是不是它发明的,而且也与原有的概念不同了)。
但为什么这么多年了,这概念还局限在几十年前的样子? 不能推广到模块的组织方式上?


starwing83 发表于 2012-11-18 15:55
是不是每次写C的时候你都要-Werror你才爽?哦,对了,你不写C的。

我写C的时候不仅不-Werror, 甚至会-w。  因为这是我写的代码, 我知道它们在做什么。
而hidden module是别人的代码, 你能完全了解别人在做什么? 这可能都还比较容易。  相对于了解作者究竟想做什么来说的话。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP