免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: __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
41 [报告]
发表于 2012-11-19 06:35 |显示全部楼层
回复 102# OwnWaterloo


    哥哥你是pythoner么……你不知道这是Python的相对模块载入语法么?

好吧我科普一下吧……如果模块名前带.,代表这个模块是相对本文件的。

如果模块名前面带多个.,每多一个点代表相对本文件的目录的父目录,比如对文件a/b/c/d/e/f.py里面的代码,import ..foo表示载入a/b/c/d/foo.py,而import ....foo表示a/b/foo.py。


这个能OK是因为import是语法…………是编译期处理的,而编译期文件名肯定没被strip掉的。

debug的信息是可能变化/消失,而且必须保持和别人的兼容。反正总的来说就是这货要小心小心再小心,能不用即别用……但是……人肉写current_file_name是不是太脏了点?

论坛徽章:
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 [报告]
发表于 2012-11-21 01:19 |显示全部楼层
本帖最后由 starwing83 于 2012-11-21 01:23 编辑

回复 110# OwnWaterloo


    真是太荒谬了!!!

我想问你,GCC实现异常的两大方法中,Windows实现C++异常的标准方法中,都有一个叫做SJLJ!请问这是什么?

凭什么non-local jump就不是异常?凭什么异常对象提取/异常扔出转换就不是异常了?

看看纯正的异常吧(C++):

1.
int f() {
   MyClass c;
   do_something();
}

2.
int f() {
  try {
    do_something();
  } catch (Exception& e) {
     ...
  }
}

思考题:
1. 在1中,这个函数本身,是不是无论如何编译都是可以在异常中,让c析构的?(答案明显是不是:至少要给出在unwind的时候,需要做的事情。GCC的做法是unwind_handler。总而言之必须额外的信息以及额外的代码组织,换言之,普通的,不考虑异常的编译无法达到支持异常的目标,即:只有特殊支持异常编译过的代码,才能够支持异常。)

2. 在2中,请问catch块是不是状态码/异常转换?请问catch和Lua的pcall究竟有什么区别?

编辑一下:这里做个说明,免得你又不知道我在说什么。
思考题1的意思是:要实现异常,就必须做出某种特殊处理。首先Lua的实现方式不是异常到状态码转换。Lua扔的自始自终就是完全合法的object。Lua只是缺乏类似Python的with,C++的析构这样的机制。但是用newtry完全可以弥补这个问题。因此Lua的异常和Python/C++的全无区别(请告诉我有什么事情是C++做得到而Lua做不到的)。

思考题2的意思是:即使在C++里面,要实现catch,实质上也意味着某种转换,意味着隐式的unwind和显式的代码执行行为的转换。这里的unwind就是longjmp,而代码执行就是普通的某快代码的执行。和Lua相比。C++只是多了一种内置语法而已


你太狭隘了知不知道?

请回答下面的问题:

1. 是不是只有语言明确说明内置异常,才是真的支持异常?
2. 是不是无论我将sjlj如何包装,结果都不是异常?
3. 如果第二问是否,那么newtry+protect包装+Lua的基础异常设施(pcall,error)是不是异常?


我真的很不明白,如果我不告诉你Lua的pcall如何实现,我只告诉你:

1. newtry(function()
    -- code1
end)(function()
   -- code2
end)
等价
try {
  -- code2
} catch(...) {
  -- code1
}


2. error { object }
等价:
throw object

3. if protect(function()
   -- code 1
end)(...) then
   -- code 2
end
等价:
try {
  -- code 1
} finially {
  -- code 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
43 [报告]
发表于 2012-12-06 14:33 |显示全部楼层
回复 121# OwnWaterloo


    网吧,我简单回一下。

是的,都支持。

newtry/protect机制的初衷,就是为了不用在每个调用上判断错误,因为这是在socket编程上非常普遍的事情。

这么说你明白了?

我想我知道你的误会在哪儿了。我可以明确的告诉你:Lua社区目前对于错误处理,的确依然还是local err, ... = f(...)这种。

那么我为什么说Lua本身已经支持异常了呢?我告诉你重点在哪儿,重点在:不是每个调用的地方,你都必须得这么写

明白了没?只有在你需要处理错误的时候,你才需要这么写,这就是Lua版本的catch。

如果你暂时不知道如何处理错误,或者不喜欢处理错误,直接写这个函数调用即可,不用传递返回值

你明白了吗?

顺带说一句,newtry/protect完全支持finially的语意。可以支持一段代码,无论如何都能被执行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP