Portál AbcLinuxu, 28. května 2024 10:34

Rekurze v erlang shellu

4.7.2007 11:46 | Přečteno: 1102× | erlang

Jedna z výtek na adresu erlangu, co jsem zaznamenal, je nemožnost napsat rekurzivní funkci přímo v shellu. Přitom je to spíše příznak nedostatku informovanosti. Přiznám se bez mučení, že jsem to taky ze začátku nevěděl, protože k tomu je potřeba devilish ingenuity (slovy Joe Armstronga na straně 57). Ve výše odkazované disertační práci je jako ukázka výpočet faktoriálu.

6> Fact = fun(X) ->
      G = fun(0,F) -> 1;
             (N, F) -> N*F(N-1,F)
      end,
      G(X, G)
   end.
#Fun<erl_eval.5.123085357>
7> Fact(4).
24

Pokud vás z uvedeného kódu nebolí hlava, tak jděme dále. Co třeba funkce, která bude vracet sekvencery (funkce vracející list hodnot se zvoleným krokem). Nic těžkého, ta rekurze je tam stejně jen jedna:

14> StepSeqGen = fun(Step) ->
      G = fun(X,Y,Z,F) when X > Y -> [];
             (X,Y,Z,F) -> [X|F(X+Z, Y, Z, F)]
      end,
      fun(Start,Stop) -> G(Start, Stop, Step, G) end
    end.
#Fun<erl_eval.6.56006484>
15> ByOne=StepSeqGen(1).
#Fun<erl_eval.12.115169474>
16> ByOne(1,10).
[1,2,3,4,5,6,7,8,9,10]
17> ByTwo = StepSeqGen(2), ByTwo(0,10).
[0,2,4,6,8,10]
18> (StepSeqGen(3))(0,10).
[0,3,6,9]

Takže rekurze přímo v shellu psát jdou i když to není na první pohled zrovna patrné. Stačí jen troška té devilish ingenuity.

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

4.7.2007 14:58 pkm
Rozbalit Rozbalit vše Re: Rekurze v erlang shellu
Odpovědět | Sbalit | Link | Blokovat | Admin
No to je tedy state of the art příspěvek (už dlouho se tu nikdo neodvolával na něcí disertaci, to jou samé wikiny a osnews :-)

A když to není v shellu, tak rekurze jde i bez toho předávání funkce jako parametru?
4.7.2007 15:17 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Rekurze v erlang shellu
To je tak, když Erlang nemá letrec. ;-) Možná i v něm by se občas hodil.
4.7.2007 18:58 Tom.š Ze.le.in | skóre: 21 | blog: tz
Rozbalit Rozbalit vše Re: Rekurze v erlang shellu
Ale co, letrec se vzdycky da funkcionalne nahradit Y kombinatorem, ne? :)
5.7.2007 18:18 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Rekurze v erlang shellu
a neni toto nahodou jen stary dobry y-kombinator?
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
4.7.2007 18:34 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Rekurze v erlang shellu
A když to není v shellu, tak rekurze jde i bez toho předávání funkce jako parametru?
Samozřejmě.
XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.