关于什么东西是 Elisp 可以实现但是 Python 不能实现的。

取 source 的话需要一个 function 或 module 做为载体的样子,然后就会遇到作用域的问题。

还有这样做的话代码执行的流程就已经被修改了。例如这样的情况下:

(spy (+ (spy (+ (spy x) 1)) 1))

不需要,有兩種方案。一種是 hook python 啟動過程。比較經典的(我個人認為)就是 紅姐的 moshmosh

另一個是改 coding,這個有 inlinec

# coding: inlinec
from inlinec import inlinec

@inlinec
def Q_rsqrt(number):
    float Q_rsqrt( float number )
    {
        long i;
        float x2, y;
        const float threehalfs = 1.5F;

        x2 = number * 0.5F;
        y  = number;
        i  = * ( long * ) &y;                       // evil floating point bit level hacking
        i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
        y  = * ( float * ) &i;
        y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration

        return y;
    }

print(Q_rsqrt(1.234))
1 个赞

所有作用域問題你都可以在 ast 裏面加上 global non-local 來解決,問題不大,就是看你想寫的多複雜

这个东西看起来不错啊,虽然不写 Python 也去了解下。


有个题外话,这个方案 2, Python inline 的 C 函数,是不是都会被认为是 builtin 的函数,然后缺失一些 metadata?

用 ast ,Python 可以構建一些非法的變量名稱,比如 xx$xx 這種變量,用 ast 就能生成使用

當然,跟有宏的lisp,有 TH 的 Haskell 比起來,想玩這些東西,是困難多了(

不會的

1 个赞