Portál AbcLinuxu, 30. dubna 2025 12:47
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.
Tiskni
Sdílej:
letrec
. A když to není v shellu, tak rekurze jde i bez toho předávání funkce jako parametru?Samozřejmě.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.