andelf fledna Feather
2009年7月29日星期三
2009年7月15日星期三
Compile haskell package on win32
Many haskell packages depends on some libs, for e.g. libssl, libcurl, ...
so, when that goes to win32, things become complicated...
I find an easy way to do it:
Install Dev-cpp and use its devpackage system. There are lots of packages for c/c++, so when compile haskell packages:
simply pass --extra-include-dirs= and --extra-lib-dirs= to Setup.[l]hs
2009年4月12日星期日
python 中 lambda 的倒掉
灵感来自: http://math.andrej.com/2009/04/09/pythons-lambda-is-broken/
长话短说, 先看代码.
>>> fs = [(lambda n: i + n) for i in range(10)] >>> fs[3](4) 13不觉得该是
3 + 4 = 7 么?
>>> [f(4) for f in fs] [13, 13, 13, 13, 13, 13, 13, 13, 13, 13].....撞石头上了... 换
def 看:
>>> fs = [] >>> for i in range(10): ... def f(n): return i+n ... fs.append(f) ... >>> [f(4) for f in fs] [13, 13, 13, 13, 13, 13, 13, 13, 13, 13]其实这时候已经有点眉目了, 继续看下去:
>>> fs = [] >>> for i in range(10): ... def f(n, i=i): return i+n ... fs.append(f) ... >>> [f(4) for f in fs] [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]作者提到 Haskell 是没问题的:
Prelude> let fs = [(\n -> i + n) | i <- [0..9]] Prelude> [f(4) | f <- fs] [4,5,6,7,8,9,10,11,12,13]想也是~ Haskell 就是做这个的. 怎么回事呢? 我觉得是 lexical scope(static scope) 和 dynamic scope 的关系. lisp 中一般都会讲到这个. 在 def 使用时就已经可以看出, i 在这里作为全局变量了(或者说是上一级变量), 而调用的时候使用的是当前全局环境中的 i. 而 def f(n, i=i) 中, 局部 i 覆盖了全局的 i, 那么也就是说, def 参数列表中默认值参数在定义后就已经绑定.
2009年4月11日星期六
python 的 yield
以前只是类似生成器表达式那样使用...
其实有N多牛B用法.
真长见识~!
http://www.dabeaz.com/coroutines/index.html
例如:
# grep.py
#
# A very simple coroutine
def grep(pattern):
print "Looking for %s" % pattern
while True:
line = (yield)
if pattern in line:
print line,
# Example use
if __name__ == '__main__':
g = grep("python")
g.next()
g.send("Yeah, but no, but yeah, but no")
g.send("A series of tubes")
g.send("python generators rock!")
对于生成器函数来说, 有 next() ,send(), throw() 方法.
- next() 比较容易理解.
- send(arg) 向生成器发送参数, 会被 line = (yield) 捕获.
- throw(typ[,val[,tb]]) -> raise exception in generator, return next yielded value or raise StopIteration. 参数分别是, 异常类型, 异常 str, traceback object.
尝试 git
尝试了下 git ...
http://www.projectlocker.com/ 提供免费的 git service, 以及更有名的 github
需要使用 ssh-keygen 生成个 pub key 加到网站里.
某目录下
git init // 初始 git add * // 加入文件/目录 git status // 察看状态 git show git commit -m "Message here" // commit 提交 git remote add xxxx git://xxxx/xxx.git/ // 加入 remote git branch // 分支管理 git branch -r // 察看 remote branch git push xxxx master git fetch // 抓取版本 git checkout // 导出分支内容,切换分支 git-pull = git-fetch + git-merge 等等
2008年10月18日星期六
string.h 中 strtok 提示段位错误
strtok 函数
char *p = "asdf asdf asdfasd asdf";
char *sp = " ";
char *t;
t = strtok(p, sp);
提示段位错误
原因很简单, strtok 会修改它第一个参数所指向内存的内容.
所以正确的方法是:
char buf[] = "asdf asfd asdf";
char *p = buf;
再调用.
具体点, 是因为数组初始化和指针初始化两种处理字符串方法的微小不同引起的.
2008年10月9日星期四
compile wget 1.11.4 using mingw32/dev-cpp with inet6 support
I want to get the -6 option of wget, that is --inet6-only. as on my debian computer. so I enabled SSL support and compile normally, but inet6 can't work. I searched config.h and found: /* Define if IPv6 support is enabled. */ /* #undef ENABLE_IPV6 */ simplily add: #define ENABLE_IPV6 but make report error message: host.o:host.c:(.text+0x285): undefined reference to `getaddrinfo@16' host.o:host.c:(.text+0x6d4): undefined reference to `freeaddrinfo@4' .... search all my .o file then add "-lws2_32" to LIBS in Makefile everything goes OK! 在 win32 下编译 wget 的 ssl, 及 int6/ipv6 支持 我的做法是修改 config.h 和 Makefile 在config.h 中加入 #define ENABLE_IPV6 Makefile 的LIBS 加入 -lws2_32
2008年10月3日星期五
Pyton 字符串方法详解
本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息。
在编程中,几乎90% 以上的代码都是关于整数或字符串操作,所以与整数一样,Python 的字符串实现也使用了许多拿优化技术,使得字符串的性能达到极致。与 C++ 标准库(STL)中的 std::string 不同,python 字符串集合了许多字符串相关的算法,以方法成员的方式提供接口,使用起来非常方便。 字符串方法大约有几十个,这些方法可以分为如下几类(根据 manuals 整理):
| 类型 | 方法 | 注解 |
| 填充 | center(width[, fillchar]) , ljust(width[, fillchar]), rjust(width[, fillchar]), zfill(width), expandtabs([tabsize]) | l fillchar 参数指定了用以填充的字符,默认为空格 l 顾名思义,zfill()即是以字符0进行填充,在输出数值时比较常用 l expandtabs()的tabsize 参数默认为8。它的功能是把字符串中的制表符(tab)转换为适当数量的空格。 |
| 删减 | strip([chars]), lstrip([chars]), rstrip([chars]) | *strip()函数族用以去除字符串两端的空白符,空白符由string.whitespace常量定义。 |
| 变形 | lower(), upper(), capitalize(), swapcase(), title() | title()函数是比较特别的,它的功能是将每一个单词的首字母大写,并将单词中的非首字母转换为小写(英文文章的标题通常是这种格式)。 >>> 'hello wORld!'.title() 'Hello World!' 因为title() 函数并不去除字符串两端的空白符也不会把连续的空白符替换为一个空格,所以建议使用string 模块中的capwords(s)函数,它能够去除两端的空白符,再将连续的空白符用一个空格代替。 >>> ' hello world!'.title() ' Hello World!' >>> string.capwords(' hello world!') 'Hello World!' |
| 分切 | partition(sep), rpartition(sep), splitlines([keepends]), split([sep [,maxsplit]]), rsplit([sep[,maxsplit]]) | l *partition() 函数族是2.5版本新增的方法。它接受一个字符串参数,并返回一个3个元素的 tuple 对象。如果sep没出现在母串中,返回值是 (sep, ‘’, ‘’);否则,返回值的第一个元素是 sep 左端的部分,第二个元素是 sep 自身,第三个元素是 sep 右端的部分。 l 参数 maxsplit 是分切的次数,即最大的分切次数,所以返回值最多有 maxsplit+1 个元素。 l s.split() 和 s.split(‘ ‘)的返回值不尽相同 >>> ' hello world!'.split() ['hello', 'world!'] >>> ' hello world!'.split(' ') ['', '', 'hello', '', '', 'world!'] 产 生差异的原因在于当忽略 sep 参数或sep参数为 None 时与明确给 sep 赋予字符串值时 split() 采用两种不同的算法。对于前者,split() 先去除字符串两端的空白符,然后以任意长度的空白符串作为界定符分切字符串(即连续的空白符串被当作单一的空白符看待);对于后者则认为两个连续的 sep 之间存在一个空字符串。因此对于空字符串(或空白符串),它们的返回值也是不同的: >>> ''.split() [] >>> ''.split(' ') [''] |
| 连接 | join(seq) | join() 函数的高效率(相对于循环相加而言),使它成为最值得关注的字符串方法之一。它的功用是将可迭代的字符串序列连接成一条长字符串,如: >>> conf = {'host':'127.0.0.1', ... 'db':'spam', ... 'user':'sa', ... 'passwd':'eggs'} >>> ';'.join("%s=%s"%(k, v) for k, v in conf.iteritems()) 'passswd=eggs;db=spam;user=sa;host=127.0.0.1' |
| 判定 | isalnum(), isalpha(), isdigit(), islower(), isupper(), isspace(), istitle(), startswith(prefix[, start[, end]]), endswith(suffix[,start[, end]]) | 这些函数都比较简单,顾名知义。需要注意的是*with()函数族可以接受可选的 start, end 参数,善加利用,可以优化性能。 另,自 Py2.5 版本起,*with() 函数族的 prefix 参数可以接受 tuple 类型的实参,当实参中的某人元素能够匹配,即返回 True。 |
| 查找 | count( sub[, start[, end]]), find( sub[, start[, end]]), index( sub[, start[, end]]), rfind( sub[, start[,end]]), rindex( sub[, start[, end]]) | find()函数族找不到时返回-1,index()函数族则抛出ValueError异常 另,也可以用 in 和 not in 操作符来判断字符串中是否存在某个模板。 |
| 替换 | replace(old, new[,count]), translate(table[,deletechars]) | l replace()函数的 count 参数用以指定最大替换次数 l translate() 的参数 table 可以由 string.maketrans(frm, to) 生成 l translate() 对 unicode 对象的支持并不完备,建议不要使用。 |
| 编码 | encode([encoding[,errors]]), decode([encoding[,errors]]) | 这 是一对互逆操作的方法,用以编码和解码字符串。因为str是平台相关的,它使用的内码依赖于操作系统环境,而unicode是平台无关的,是Python 内部的字符串存储方式。unicode可以通过编码(encode)成为特定编码的str,而str也可以通过解码(decode)成为unicode。 |
2008年10月2日星期四
强悍的类定义
>>> class Config(object):
... def __init__(self, **kw):
... self.__dict__.update(kw)
...
那么:
>>> cfg = Config(host = '127.0.0.1', port = '8080')
>>> print "%s:%s"%(cfg.host, cfg.port)
127.0.0.1:8080
更变态版本:
>>> def Config(**kw):
... obj = type('Config', (), kw)()
... return obj
...
>>> c = Config(host = '127.0.0.1', port = '8080')
>>> c.host, c.port
('127.0.0.1', '8080')
来自: http://blog.csdn.net/lanphaday/archive/2008/09/09/2905877.aspx
订阅:
博文 (Atom)
