取 source 的话需要一个 function 或 module 做为载体的样子,然后就会遇到作用域的问题。
还有这样做的话代码执行的流程就已经被修改了。例如这样的情况下:
(spy (+ (spy (+ (spy x) 1)) 1))
取 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))
所有作用域問題你都可以在 ast 裏面加上 global non-local 來解決,問題不大,就是看你想寫的多複雜
这个东西看起来不错啊,虽然不写 Python 也去了解下。
有个题外话,这个方案 2, Python inline 的 C 函数,是不是都会被认为是 builtin 的函数,然后缺失一些 metadata?
用 ast ,Python 可以構建一些非法的變量名稱,比如 xx$xx 這種變量,用 ast 就能生成使用
當然,跟有宏的lisp,有 TH 的 Haskell 比起來,想玩這些東西,是困難多了(
不會的