Wed 06 October 2010

Variable Tab-Breite in Python

In Python 2 kann man dem Tokenizer mittels Kommentaren mitteilen, wie breit ein Tab ist:

# :ts=4
if 1:
    if 0:
        print 1
     print 2 # hard tab here

Führt man den Code aus, wird 2 ausgegeben. Entfernt man den Kommentar, wird nichts ausgegeben.

Wed 30 September 2009

marshal-Spaß

>>> import marshal
>>> marshal.loads('l\x02\x00\x00\x00\x00\x00\x00\x00')
00000L
>>> bool(_)
True
>>>

Mon 24 August 2009

Wegoptimierte Syntaxfehler

Manche Syntaxfehler können in CPython wegoptimiert werden:

>>> if 0:
...     yield
...
>>> if 1:
...     yield
  File "<input>", line 2
SyntaxError: 'yield' outside function (<input>, line 2)

Sat 14 March 2009

eval in Erlang

Der Code vom erl_eval-Modul von Erlang/OTP, der fun-Ausdrücke implementiert (kann man in lib/stdlib/src/erl_eval.erl finden):

%% This is a really ugly hack!
F =
case length(element(3,hd(Cs))) of
    0 -> fun () -> eval_fun(Cs, [], En, Lf, Ef) end;
    1 -> fun (A) -> eval_fun(Cs, [A], En, Lf, Ef) end;
    2 -> fun (A,B) -> eval_fun(Cs, [A,B], En, Lf, Ef) end;
    3 -> fun (A,B,C) -> eval_fun(Cs, [A,B,C], En, Lf, Ef) end;
    4 -> fun (A,B,C,D) -> eval_fun(Cs, [A,B,C,D], En, Lf, Ef) end;
    5 -> fun (A,B,C,D,E) -> eval_fun(Cs, [A,B,C,D,E], En, Lf, Ef) end;
    6 -> fun (A,B,C,D,E,F) -> eval_fun(Cs, [A,B,C,D,E,F], En, Lf, Ef) end;
    7 -> fun (A,B,C,D,E,F,G) ->
       eval_fun(Cs, [A,B,C,D,E,F,G], En, Lf, Ef) end;
    8 -> fun (A,B,C,D,E,F,G,H) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H], En, Lf, Ef) end;
    9 -> fun (A,B,C,D,E,F,G,H,I) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I], En, Lf, Ef) end;
    10 -> fun (A,B,C,D,E,F,G,H,I,J) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J], En, Lf, Ef) end;
    11 -> fun (A,B,C,D,E,F,G,H,I,J,K) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K], En, Lf, Ef) end;
    12 -> fun (A,B,C,D,E,F,G,H,I,J,K,L) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L], En, Lf, Ef) end;
    13 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M], En, Lf, Ef) end;
    14 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N], En, Lf, Ef) end;
    15 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O], En, Lf, Ef) end;
    16 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P], En, Lf, Ef) end;
    17 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q], En, Lf, Ef) end;
    18 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R], En, Lf, Ef) end;
    19 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S],
                En, Lf, Ef) end;
    20 -> fun (A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T) ->
       eval_fun(Cs, [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T],
                En, Lf, Ef) end;
    _Other ->
        erlang:raise(error, {'argument_limit',{'fun',Line,Cs}},
                     stacktrace())