Prý jde toto:
import hy
x = hy.lex.tokenize("(defn foo [] (print 'fnord))")
hy.importer.hy_eval(x, globals(), "__main__")
to by šlo, ale bez podpory odsazování v IDE to není moc použitelné na delší funkce
import hy
def fn(s):
return lambda it: hy.eval(hy.read_str(s),
{'it': it})
>>> list(map(fn('(* it 2)'), range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
def q(s):
return hy.eval(hy.read_str(s))
>>> import functools
>>> functools.reduce(q('*'), range(1,10)) # faktorial
362880
PyCharm vám to odsadí i obarví v rámci inline kódu, stačí pak tu sekvenci schovat do funkce a tu volat:
defhy("
(fn [x] + x 1)
")
Ale nijak si tím nepomůžete protože
lambda x: x+1
se moc neliší od zápisu
fn [x] + x 1
Liší se jen v délce klíčového slova, mě se osvědčilo spíše COBOLovské řazení a obdoba příkazu PERFORM
def fn1(x):
return x + 1
def fn2(x):
return x + n
map(fn2, map(fn1, list_data))
U krátkých funkcí žádná výhoda Lispu není, ale složitější funkce nejdou v Pythonu zapsat jako výraz. Lambda funkce v Pythonu je lepší nepoužívat. Na jendoduché operace jako násobení lze použít knihovnu operator
>>> from operator import mul >>> functools.reduce(mul, range(1,10)) 362880
V Lispu ale taky ne, protože tam žádné výrazy nejsou, jen seznamy :-)
"vyraz" je terminus technikus a skoro se da rici ze cim slusnejsi (tozn zpusobujici mene frustrace) jazyk tim vetsi procento konstruktu je vyraz, z tohohle pohledu na tom Python moc dobre neni, protoze vyraz neni ani prirazeni napr..
Díky tomu, že vše není výraz, má python jednoduchá pravidla pro odsazování. Přiřazení jako výraz by porušovalo konvenci, že funkce a konstrukce se side-efekty nemají vracet hodnotu.
Ktery jazyk zpusobuje mene frustrace nez Python. Napada me jen anglictina...
to ne, lambda je v Pythonu mnohem omezenejsi, nez LISPovske anonymni funkce zapisovane pro vetsi zmatek taky pres (lambda) nebo v Clojure pres (fn). A pro filtry atd. je prece zbytecne psat pojmenovane throw-away funkce ne?
Me ty pojmenovane funkce nevadi, protoze je to citelnejsi. Omezeni Python lambda mi nepripada spatne. Ale docela bych rad videl nejaky priklad kde to dre.
napadaji me jakekoli aplikace map a filter, popr. sort a dost jsem je pouzival pri registraci callback funkci pri zahazovani nepotrebnych parametru. Neco na zpusob:
on_something(lambda event: callback_function())
nebo naopak pro pridani uzaveru:
on_something(lambda: callback_function(uzaver))
samozrejme lambdy jako takove nejsou ze striktniho pohledu v jazyku typu Python nutne, ale to se da rict i naopak - funkce nejsou nutne, protoze lambdu jde priradit do promenne a tak ji "pojmenovat"
původní příkaz PERFORM :-) Tělo příkazu či cyklu mimo samotný příkaz.
viz
https://www.google.com/imgres?imgurl=http://www.mainframestechhelp.com/tutorials/cobol/cobol_common_files/images/perform_through_code.jpg&imgrefurl=http://www.mainframestechhelp.com/tutorials/cobol/cobol-perform-through.htm&h=862&w=1117&tbnid=KYEtR6e5ECiyVM:&tbnh=154&tbnw=199&usg=__OQ8AkPVsPFLKOqQr3ZNORSuzw14%3D&vet=10ahUKEwin2v--8JnbAhXDCSwKHfj3BpEQ_B0I8AEwEw..i&docid=gSfBS4Y6NTrybM&itg=1&client=ubuntu&sa=X&ved=0ahUKEwin2v--8JnbAhXDCSwKHfj3BpEQ_B0I8AEwEw#h=862&imgdii=KYEtR6e5ECiyVM:&tbnh=154&tbnw=199&vet=10ahUKEwin2v--8JnbAhXDCSwKHfj3BpEQ_B0I8AEwEw..i&w=1117