摘要: 首先声明,我用的是2.7.1版本的CPython。第一个问题,闭包中的upvalue不可修改: 1 def foo(): 2 i = 0 3 def _foo(): 4 i += 1 5 print i 6 return _foo 7 8 f = foo() 9 f()10 f()11 f()错误:local variable 'i' referenced before assignment可以理解,不用global关键字的话,修改全局变量也会遇到问题。因此这个问题其实是不能修改所有外层变量。python3引入了nonlocal来处理这... 阅读全文
posted @ 2012-01-12 19:35 Scan. 阅读(1381) 评论(0) 推荐(1) 编辑
摘要: 在这两种语言中,表达式a and b的返回值不是true或false,而是a/b当中非真的值,而表示a or b返回的是a/b当中为真的那个。因此,要想模拟C/C++中的三元操作符c ? a : b,简单的用c and a or b是不行的,因为当c为真,而a为假时,返回的是b而不是a,这不符合三元操作符的定义。以前学lua的时候,看lua之父的那本《lua程序设计》,他提到这个问题,但没有说怎么解决,而是推荐用普通的if/else代替,今天我在看《python核心编程》的时候,发现原来python社区早处理好了这个问题(当然,肯定lua社区早也处理好,我不知道罢了),这里也在lua中测试一下 阅读全文
posted @ 2012-01-09 23:20 Scan. 阅读(5400) 评论(0) 推荐(0) 编辑
摘要: 今天我中断了bash的学习。第一个原因是,《高级bash脚本编程指南》这本书够厚,细节够多,我啃起来很吃力。但这并不是说它很深奥,这本书很好,只是太过纠结于细节。如果你能认真读完并掌握此书,肯定算得上是bash老手了,说精通也不为过。更主要的原因是,我深刻的感受到一点,bash脚本的设计思路中有一个问题,即,它更倾向于将功能集成在语言中,它选择将常用的库功能实现为特殊符号的组合,而非将常用库组织为函数和参数。这种选择带来的好处是,对于精通bash语法的老手来说,他们可以用有限几个特殊字符的组合来代替编写复杂的函数调用,提高了编辑效率。但显然,这样一堆奇怪文字组成的代码会给对shell语法不熟的 阅读全文
posted @ 2012-01-02 23:23 Scan. 阅读(931) 评论(0) 推荐(0) 编辑
摘要: 一段shell脚本,放在linux中运行,会自动枚举/bin、/usr/bin等目录下的所有可执行文件,然后查找man生成html的说明文档。生成的文档包中index.html是目录。这包文档可以用在无man而又想使用unix tools的时候,如在windows下玩grep。#! /bin/bashhelpDir=man_pagesmain_file=./$helpDir/index.htmlcmds=`{ for j in ${PATH//:/ } do ls $j done} | sort | uniq `rm -f -r $helpDirmkdir $h... 阅读全文
posted @ 2012-01-02 01:08 Scan. 阅读(874) 评论(5) 推荐(1) 编辑
摘要: 对应于Windows下的interlocked系列:type __sync_fetch_and_add (type *ptr, type value, ...)type __sync_fetch_and_sub (type *ptr, type value, ...)type __sync_fetch_and_or (type *ptr, type value, ...)type __sync_fetch_and_and (type *ptr, type value, ...)type __sync_fetch_and_xor (type *ptr, type value, ...)type 阅读全文
posted @ 2011-12-21 20:39 Scan. 阅读(766) 评论(0) 推荐(0) 编辑
摘要: 我在这里记录一下对GNU make处理makefile这个过程的思考: 1. 执行make命令后,GNU make扫描整个makefile,将其中出现的变量赋值和目标依赖关系记录到数据库(就是make解析makefile得到的所有数据集合,用make -p查看)中,其中每个变量记录变量名及其字面值(用$(value)可以查看,即如myVar = $(CFLAG)的字面值就是$(CFLAG),暂不进行展开)。这个过程中对$所标记的变量或函数不进行任何展开,除非遇到几种特殊情况(后文提到)。 2.扫描整个数据库,展开所有$引导的变量和函数(这里至少有两趟扫描,首先会扫描$(value)调用... 阅读全文
posted @ 2011-12-04 23:55 Scan. 阅读(553) 评论(0) 推荐(0) 编辑
摘要: 想在当前目录及子目录的.cpp文件中搜索关键字char,键入:grep -R char *.cpp失败。找了很久原因,发现这样一个事实:-R选项的确会进入子目录递归匹配,但前提是,子目录名称也必须满足*.cpp的命名规则,也就是说,对于如下目录层次应用上面的命令:./1.cpp./2.cpp./dir.cpp/3.cpp./dir/4.cpp其中./dir/4.cpp由于目录名称不满足*.cpp的命名规则,4.cpp这个文件是不会参与匹配的...正确的方案得引入管道:find -type f -name *.cpp | xargs grep char由于我自己的应用场合不太适合管道,最终降低要 阅读全文
posted @ 2011-11-28 20:47 Scan. 阅读(2189) 评论(0) 推荐(0) 编辑
摘要: 这篇笔记是我在读《Windows核心编程》第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的。开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯。 海量细节。第1章 错误处理1. GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖。2. GetLastError可能用于描述成功的原因(CreatEvent)。3. VS监视窗口err,hr。4. FormatMessage。5. SetLastError。第2章 字符和字符串处理1. ANSI版... 阅读全文
posted @ 2011-09-30 12:24 Scan. 阅读(8744) 评论(1) 推荐(3) 编辑
摘要: 进程启动后使用的默认CPU集合,VC的链接选项中并无设置,可以自己修改PE文件:1 LOADED_IMAGE img = {0};2 MapAndLoad("C:/Test05", NULL, &img, FALSE, FALSE);3 IMAGE_LOAD_CONFIG_DIRECTORY dir = {0};4 GetImageConfigInformation(&img, &dir);5 6 dir.ProcessAffinityMask = 3;7 8 SetImageConfigInformation(&img, &dir) 阅读全文
posted @ 2011-08-04 22:24 Scan. 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 测试代码:1 FILE *f = fopen("1.txt", "w");2 printf("%x\n", f);3 fprintf(f, "%s", "0123");4 FILE *f2 = freopen("2.txt", "w", f);5 printf("%x\n", f);6 printf("%x\n", f2);7 fprintf(f, "%s", "0123"); 阅读全文
posted @ 2011-07-20 13:49 Scan. 阅读(4433) 评论(4) 推荐(0) 编辑