Seite 1 von 1

Generische Funktionen in 6 Zeilen Code

Verfasst: Donnerstag 3. April 2008, 08:25
von sma
Ich habe neulich jemanden mit Hilfe dieses Codes von Python vorgeschwärmt. Vielleicht findet es ja noch jemand interessant.

Aufgabe:

Code: Alles auswählen

E = ('mul', ('add', ('lit', 3), ('lit', 4)), ('lit', 3))
print evl(E)
Lösung:

Code: Alles auswählen

@gen
def evl_mul(x, y): return evl(x) * evl(y)

@gen
def evl_add(x, y): return evl(x) + evl(y)

@gen
def evl_lit(x): return x
Meta-Magie:

Code: Alles auswählen

def gen(f):
    b, s = f.__name__.split("_")
    g = globals()
    if b not in g:
        def gen(t): return g[b].func_dict[t[0]](*t[1:])
        g[b] = gen
    g[b].func_dict[s] = f
Stefan

Re: Generische Funktionen in 6 Zeilen Code

Verfasst: Donnerstag 3. April 2008, 10:32
von keppla
Da ist man glatt versucht, das Zitat

"Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp"

um

"...which is, more or less an implementation python's tuples"

erweitern ;)
Ne, aber schon ziemlich cool, was man so machen kann.

Verfasst: Donnerstag 3. April 2008, 11:48
von Y0Gi
Ist `evl()` hypothetisch oder wo soll das herkommen?

Verfasst: Donnerstag 3. April 2008, 11:55
von keppla
Y0Gi hat geschrieben:Ist `evl()` hypothetisch oder wo soll das herkommen?
wenn ich das richtig verstehe, wird es hier

Code: Alles auswählen

if b not in g:
        def gen(t): return g[b].func_dict[t[0]](*t[1:])
        g[b] = gen
angelegt, wenn es nicht existiert.
Das ganze sollte auch mit anderen prefixes klappen.

Verfasst: Donnerstag 3. April 2008, 22:38
von mitsuhiko
Wenn schon Magie, dann richtig. Also f.func_globals statt globals().

Verfasst: Samstag 5. April 2008, 08:36
von sma
Stimmt. Danke.

Stefan