免费注册 查看新帖 |

Chinaunix

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

[其他] tcsh,shebang和clojure [复制链接]

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
41 [报告]
发表于 2012-10-09 22:13 |只看该作者
回复 37# OwnWaterloo

修改env,至少可以让linux下的env与bsd下的env看齐。毕竟多数情况下,二者之间的兼容性很高的。不过话说回来,有些工具bsd做得很好,比如tar,不用区分压缩格式,自动识别。
   

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

我的感觉是。。。 修改env比劝说他人更新env难多了。。。
我自己就是个不爱升级软件的人。。。  ubuntu现在还在用8.04。。。  windows还在用xp sp2。。。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
43 [报告]
发表于 2012-10-09 22:33 |只看该作者
回复 42# OwnWaterloo

还停留在08年?

其实用脚本写个支持分拆参数的env,也很简单,可以随你的程序走。

   

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

总不能小数据量一种写法,大数据量了再换另一种写法吧。。。
虽然有"先舒服地写,profiling后再挑重点改"的说法,我感觉说的不是同一件事。
现在出现的性能问题基本上都是自己把lazy用错了。。。  但编程的风格依然没变,无论数据量多少都不会改回循环(或loop/recur或do syntax)。


至于lua里怎么完成。。。   事不关己。。。 (主要是明年之前都很忙。。。 除非想通了半途而废)。
lazy table怎么弄? 比如, 如何实现一个range函数:

  1. for _,x in range(12) do print(x) end
复制代码
或者in ipairs(range(12))也行。 总之:
1. range(n)需要的内存与n无关
2. 并且如果它产生的伪table如果只是被顺序取, 并且不保存之前的引用, 那也要求需要的内存是常数。

lua怎么做? table当cons用?

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

问题是怎么说服用户,让他把/usr/bin/env 软连接到随程序附带的那个去?

嗯,这里要区分两类用户来说。。。
大部分Windows用户是第1种,最关心的是双击、下一步、下一步、下一步。。。 然后就能用了, 不关心这过程中对系统产生了什么全局的影响。
这种很好说服。。。

另一种就特别关心安装过程到底发生了什么。。。 所以我就特别喜欢免安装的,放到目录,改改PATH或者链接就行了。
要说服这类用户替换自己的/usr/bin/env就不容易。。。
嗯,写成脚本(文本格式,看得见摸得着)可能会有帮助。。。

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

关于"不会改回循环", 我再声明一下: 没有以循环为耻。

如果能复用列表操作的库当然比一次又一次的用循环重复实现细节更好,至少少犯错。
而对clojure/haskell这种, 其实没有循环这种控制结构; 而且手写loop/recur比其他有循环结构的语言里更繁琐。。。
又容易出错, 而且还难写。。。   只要效率没问题(可能也就是一些inline做不了?), 完全没有用它们的理由。

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
47 [报告]
发表于 2012-10-09 22:57 |只看该作者
回复 45# OwnWaterloo


写个myenv:
#!/mypath/bin/myenv interpreter arg1 arg2 ... argn

就ok了,既然是脚本就不用计较速度了,更何况是初始阶段的。   

论坛徽章:
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
48 [报告]
发表于 2012-10-09 23:00 |只看该作者
本帖最后由 starwing83 于 2012-10-09 23:04 编辑

回复 44# OwnWaterloo


    range的“stateless iterator”写法(效率最高,应用最狭窄):

  1. local function range_helper(n, i)
  2.    if i <= n then return i + 1 end
  3. end

  4. function range(n)
  5.    return range_helper, n, 0
  6. end
复制代码
注意,这里一个闭包都没有的。

如果数据量大,使用方式可以不变。也就是一个抽象层而已了。而table和closure都是很好的抽象层。

假设我需要这个stateless iterator变成闭包,就需要一个函数:

  1. function iter(f, s, init)
  2.    local t = {init}
  3.    return function()
  4.        t = {f(s, table.unpack(t))}
  5.        return table.unpack(t)
  6.    end
  7. end
复制代码
注意这个写法很浪费,因为每次调用都会产生一个表。更高效的写法是在C API里面写。可以做到每次调用都不产生内存。

有了iter函数,那么就可以这样:

map(f, iter(ipairs(t1)), iter(range(10)))

iter不一定要在这里出现,甚至可以让iter函数是一个处理stateless iterator generator的函数,即抽一个地方:

  1. if data_is_too_big then
  2.     map = iter(map)
  3. end
复制代码
iter负责把表驱动的改为用闭包驱动的。这是很简单的。

好了,这是用闭包/stateless iterator作为接口。如果用表作为接口:

  1. function range(n)
  2.    return setmetatable({}, {__index = function(t, k)
  3.        if k < n then return k end
  4.    end})
  5. end
复制代码
这个写法照样是示例性的,metatable和__index函数都是可以stateless的。这没有问题。

我们可以通过lazy_table函数,做到closure/stateless到table的转换。

  1. if data_is_too_large then
  2.     map = lazy_table(map)
  3. end
复制代码
之前map接受table,返回table之前的map接受闭包,返回闭包,我们可以让现在map接受table(这需要所有的工具都被lazy_table包裹),但是返回的是个lazy_table。即惰性的table。

我们还可以设计接口,让接受表返回表的map变成接受闭包返回闭包的。方案也是上面的lazy_table,它可以让map本身接受的表实际上以前是个闭包,而返回的表实际上依然是个闭包。

这就是Lua中的序列操作和惰性操作的基本方式。有两套接口:函数和表,两套接口都是可以互相转换的,不存在兼容性问题。
      

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

嗯,我想的就是这种。。。 说服其他人替换env不容易。。。  让它另外装一个可能更容易一些。。。
但既然反正都是要装。。。 不如索性做大点。。。 就不做env那种设置环境的事了, 而是专门负责处理各种语言的shebang。。。

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

我已经跟不上了。。。
总之如果达不到前面说的对空间的要求。。。 那列表操作库就真的是在做表的转换,而不是在支持另一种编程方式。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP