Other articles


  1. [翻译] Python 内部:可调用对象是如何工作的

    原文:Python internals: how callables work

    【这篇文章所描述的 Python 版本是 3.x,更确切地说,是 CPython 3.3 alpha。】

    在 Python 中,可调用对象 (callable) 的概念是十分基本的。当我们说什么东西是“可调用的”,马上可以联想到的显而易见的答案便是函数。无论是用户定义的函数 (你所编写的) 还是内置的函数 (经常是在 CPython 解析器内由 C 实现的),他们总是用来被调用的,不是么?

    当然,还有方法也可以调用,但他们仅仅是被限制在对象中的特殊函数而已,没什么有趣的地方。还有什么可以被调用呢?你可能知道,也可能不知道,只要一个对象所属的类定义了 __call__ 魔术方法,它也是可以被调用的。所以对象可以像函数那样使用。再深入思考一点,类也是可以被调用的 ...

    read more

    There are comments.

  2. 写了个小小的 vc-fix

    我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……

    我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。

    其中我觉得最讨厌的莫过于 for 循环的循环变量不被视为 for 循环的局部变量这一点,导致大量变量被其认为是重复定义,这个是 VC6 和标准就语言上相去最远的问题了……不想每个都去改,麻烦死了。

    在网上一找,还真找到一个简单的方法:

    #define for if(0) ; else for
    

    其实我也不知道这个是什么机理 ...

    read more

    There are comments.

  3. 方便使用 VC6 编译器的小脚本

    因为一些原因,有时候不得不在 Linux 下使用 VC6 编译器。(比如学校的作业要求能在 VC6 下编译通过之类的要求)之前的用法太麻烦了,要把待编译的文件复制到 VC6 的安装目录,还要写很长的一串东西。要是能像调用 GCC 那么方便就好了~

    于是就有了下面这个小脚本:

    #!/bin/bash
    # - * - coding: UTF-8 - * -
    
    VC6_DIR="这里写上VC6的安装地址"
    
    BIN="$VC6_DIR/VC98/Bin"
    export INCLUDE="$VC6_DIR/VC98/Include"
    export LIB="$VC6_DIR/VC98/Lib"
    
    ARGS=
    
    while getopts "o:c" optname
    do
      case "$optname" in
      "o")
        ARGS ...
    read more

    There are comments.

  4. 闰年判断的优化及其他

    今天 Javran 发来短信给了一个短小的论年判断代码,并且问我是否认为有更简单的表达。下面是他最初给的代码:

    return ((y & 3 != 0) ^ (y % 100 == 0) ^ (y % 400 != 0));
    

    一切的探究就从这个代码开始了。

    当然,这个代码是错的,因为疏忽了运算符的优先级,为达到本来的目的,这段代码大概应该这样改(测试代码3):

    return (((y & 3) != 0) ^ (y % 100 == 0) ^ (y % 400 != 0));
    

    接着,我将其中“!=0”和“==0”可以进一步缩短,现在代码现在变成这样(测试代码4):

    return !!(y & 3) ^ !(y % 100) ^ !!(y % 400);
    

    OK,对于抑或得到的思路,精简到这里差不多了 ...

    read more

    There are comments.

Page 1 / 1

social