给 Garfileo 留言

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

ManateeLazyCat 说:
2012年1月13日 14:44

博主你好, 最近在写 gnome-shell 插件,我用 BoxLayout 纵向排列图像和文字, 发现如果文字在上面, 文字上下的填充是正确的, 但是如果文字放在图片下面的话, 文字的上下的填充就很大, 不正常。

请问一下 BoxLayout 是不是要设定某个选项才能让子 Actor 的填充为 0 ?

不知道怎么联系你, 所以就给你留言了, 谢谢!

Avatar_small
Garfileo 说:
2012年1月04日 17:36

@依云: 我的意思是使用 doesFileExist 与 openFile 可以写出与下面 C 代码

if (NULL == (fp = fopen ("foobar", "r")) {出错处理代码};

等价的 Haskell 代码。虽然真正实现起来有些繁琐,需要用到单子变换。

简单的方案是使用 IO 模块中的 try 函数,例如:

try $ openFile "foobar" ReadMode

Avatar_small
依云 说:
2012年1月04日 16:33

@Garfileo: 不一样啊,两个函数怎么能够一起使用呢,总有个先后啊,而且不可能说这两个函数执行的间隙不让文件系统把文件删掉。

-dynamic 试过了,自己写的 OK,调用了 cabal 回来的库时它告诉我要重新编译那些库 :-(

Avatar_small
Garfileo 说:
2012年1月04日 14:20

@依云: 晕,如果你认为“有了文件描述符文件内容就不会没了”,那 doesFileExist 与 openFile 一起使用,本身就起到了 C 语言判断 fopen 返回值的效果了。

ghc 编译文件的时候,默认是将运行时库静态连接到可执行文件中的,你可以使用 -dynamic 选项,使之成为动态连接。

Avatar_small
依云 说:
2012年1月04日 13:41

@Garfileo: 打开文件后它(的目录项)消失不消失没关系啊,有了文件描述符文件内容就不会没了,除了 NFS 那种。fopen 返回失败之后文件又可读那是以后的事了。使用 doesFileExist 的问题是,如果判定后文件消失了,openFile 失败,哗,进程挂掉了。

Haskell 还是得慢慢研究啊。它生成的可执行文件都好大。

Avatar_small
Garfileo 说:
2012年1月04日 08:02

@依云: 按照你在 #51 回复的逻辑,即使 fopen 返回 NULL, open 返回 -1 什么的,也是有时间差阿,说不定你在刚打开一个文件句柄之后,这个文件就消失了呢?说不定 fopen 刚返回 NULL 的时候,文件又有了呢?

事实上你在一开始的那个程序里使用 forM 和 readFile 来读取一组文件,这其中是有惰性的。例如 forM 在运行时并不是遇到一个文件名就开启它的句柄再读取它的内容,而是将读取文件内容的操作推迟到最后。你提供它的一组文件名,如果其中对应着不存在的文件,程序会一个文件都不读取,直接退出了。

此外,Haskell 也是有 try ... catch 机制的,见《real world haskell》第 19 章。

Avatar_small
依云 说:
2012年1月03日 22:26

@Garfileo: 我只是指望 Haskell 能更懒一些而已。不行就算了。

至于不存在的文件之类的,fopen 会返回 NULL 啊,open 会返回 -1 啊,errno 会被设置啊,strerror 会得到错误消息啊(还是国际化过的)。这些,在 Python 里就是 try,在 Haskell 里我还不知道怎么办呢。

Avatar_small
Garfileo 说:
2012年1月02日 15:24

@依云: 那你认为对于不存在的文件有什么判断方法?怎样可以让程序需要的时候自动为你打开文件描述符或读入文件内容?我觉得任何编程语言也解决不了这样的问题啊。

比如,你用 C 语言写一个 for 循环,在这个 for 循环里面 fopen 一些文件,它们的描述符也是一次性的都被开启了,遇到不存在的文件也会导致程序崩掉。Haskell 在处理 I/O 问题,与命令式语言没什么本质的区别,除了它可以在读取超级大的文件时可以利用一下惰性计算。

Avatar_small
依云 说:
2012年1月02日 14:39

@Garfileo: 文件打不开的原因有太多了(大约20来个),总不能一个个地判断吧。而且,预先判断的话会和之后的打开动作之间存在时间差,说不定那个文件就在判断完后消失了呢。

Avatar_small
Garfileo 说:
2012年1月02日 08:15

@依云: 我所指的“打开文件描述符不浪费资源”是以 openFile 相对 readFile 而言的。如果你不希望一次全打开文件,那只好放弃那个 forM。待你需要打开某文件的时候就在文件名列表中找到相应的文件名 openFile 一次。

对于不存在的文件,可以使用 doesFileExist 预先判断一下。

Avatar_small
依云 说:
2012年1月02日 01:47

@Garfileo: 谁说文件描述符不浪费资源了。你觉得那些 daemon 进程 fork 后要千辛万苦地把不用的文件描述符都关掉是为了什么?默认的文件描述符限制是 1024 个,一会儿就用完了。(比如 grep xxx **/*.[ch] 这种东西。连命令行参数上限我都超过过。)

至于遇到不存在的文件嘛,我还不会处理呢。

今天看到两样东西很不错:pandoc 和 gitit。

Avatar_small
Garfileo 说:
2011年12月31日 08:07

@依云: 打开文件描述符又不浪费资源,关闭描述符用 hClose 就可以了。可能你是因为这个 cat 程序遇到不存在的文件会导致程序直接挂掉吧。

Avatar_small
依云 说:
2011年12月30日 20:28

@Garfileo: openFile 也是一样会打开一堆文件描述符啊,而且似乎还不方便关。算了,还是传函数吧,虽然我觉得匿名函数的写法有些丑……

Avatar_small
Garfileo 说:
2011年12月29日 07:45

@依云: 呃,那你使用 openFile 只获取文件 Handle 就可以了。

Avatar_small
依云 说:
2011年12月28日 20:07

@Garfileo: 你误解我的意思的。我是嫌 Haskell 不够 lazy,还不需要打开文件时它就已经把文件打开了。按你这样写,对输入的处理就得作为一个函数传进去了。

Avatar_small
Garfileo 说:
2011年12月28日 15:36

@依云:

这是 Haskell 惰性求值运算导致的。你可以在 forM 中使用 IO 函数,强迫 Haskell 对列表元素进行求值。例如:http://garfileo.is-programmer.com/posts/31515.html

Avatar_small
依云 说:
2011年12月28日 13:32

Hello, 请教个 Haskell 问题。我写了个 Haskell 版的 cat,但是,它会在一开始就打开所有的文件描述符,而不是一个个地打开。应该怎么做才对呢?
我用的是 forM filenames readFile。完整的代码见 http://p.vim-cn.com/cvD/hs 。

Mike 说:
2011年12月26日 21:44

Hi garfileo,Vim-cn群同仁一致邀请您加入群,这个纯技术群是在 test@vim-cn.com (在gtalk里面加此contact即可)
话题不限于vim哦! have fun

ManateeLazyCat 说:
2011年12月06日 00:20

你好, 我是深度Linux的王勇, 感兴趣加入深度Linux的开发吗?
感兴趣给我发邮件吧!

BTW, 博客写的不错!

Avatar_small
Garfileo 说:
2011年10月03日 09:27

@Jack:

which version of clutter you are using?