Portál AbcLinuxu, 12. listopadu 2025 19:27
Rád bych vám představil svůj zbrusu nový výtvor, související s mým učením se funkcionálnímu jazyku erlang, vhodnému pro psaní serverů.
Jedná se o chat server, na který se dá připojit přes telnet. Možná se zrovna divíte, že něco takového musí být v erlangu na pár řádek ale ...
Na tomto projektíku jsem se naučil základům erlangu za 3 dny. Obsahuje snad všecko, co muže takový jednoduchý program obsahovat - obousměrná meziprocesová komunikace, monitor procesy, operace s seznamy, regulární výrazy, všudepřítomný pattern matching (== způsob programování v erlangu), podmínky pro výběr funkce (hlavně v kódu terminálu).
Rád bych, aby moje práce byla někomu k něčemu, takže jsem zvolil zjednodušenou BSD licenci. Naopak bych byl také rád, kdyby se objevil nějaký zkušený erlang programátor, aby to zkritizoval a já se poučil ze svých chyb.
Pokud mě erlang bude bavit a budu mít chuť, možná se mužete těšit na nějaký miniúvod do erlangu, případně na nějakou kritiku tohoto vynikajícího jazyka.
Nakonec tedy link na
DOWNLOAD 0.1Pro spuštění stačí mít nainstalovaný erlang a spustit run.sh script, který skompiluje oba zdrojáky a spustí chat server. Defaultní port je 5000, dá se změnit v chat.erl v definici skoro hned za licencí.
Updated 13.02.2010
DOWNLOAD 0.2Updated 14.02.2010
DOWNLOAD 0.2.1Updated 14.02.2010
Tiskni
Sdílej:
Pár poznámek ke kódu: Seznamy velmi často používáte jako pole, tj. snažil bych se vyhnout funkci lists:nth/2. Není třeba všude používat knihovní funkce viz třeba term:compare_strings/2, kterou by šlo napsat prakticky bez knihovních funkcí a byla by navíc efektivnější nebo napsat s knihovními funkcemi třeba takto (v Haskellu):
compareStrings as bs | as == bs = Nothing | otherwise = Just $ length $ takeWhile id $ zipWith (==) as bs
V Erlangu je potíž s funkcí lists:zipwith/3, která přijímá jen stejně dlouhé seznamy tj. musel byste řetězce oříznout na délku toho kratšího.
s mým učením se funkcionálnímu jazyku erlang
Je dobře, že se učíte funkcionální jazyk, a doufám, že po Erlangu bude následovat Haskell
Díky za připomínky. Doufám, že si nemusíme vykat
Tu compare_strings/2 jsem přepsal, mě osobně se líbí mnohem víc
compare_strings(S1, S2) when S1 == S2 ->
same;
compare_strings(S1, S2) when (S1 == []) or (S2 == []) ->
{different,0};
compare_strings(S1, S2) when length(S2) > length(S1) ->
compare_strings(S2, S1);
compare_strings(S1, S2) when length(S1) > length(S2) ->
S1Part = lists:sublist(S1, length(S2)),
compare_strings(S1Part, S2);
compare_strings(S1, S2) when length(S1) == length(S2) ->
Same = lists:zipwith(fun(X, Y) -> X == Y end, S1, S2),
{different,length(lists:takewhile(fun(X) -> X end, Same))}.
Použil jsem tu funkci lists:zipwith/3, o které jsem předtím nevěděl (díky
).
Ta funkce byla opravdu ošklivě napsaná, asi jsem se moc nesoustředil a jen psal takovým tím C stylem (funguje to, je to dobře).
S haskellem nevím, zatím pro něj nemám praktické využití (možná v budoucnu na nějakou matematiku etc.). Cesty programátora jsou nevyzpytatelné 
Takhle to vypadá lépe, ale zkus si zavolat compare_strings("auto","aut"). Já bych to napsal asi takto (bez funkcí z knihovny):
compare_strings(XS, YS) -> compare_strings(0, XS, YS).
compare_strings(I, [A|XS], [A|YS]) -> compare_strings(I+1, XS, YS);
compare_strings(_, [] , [] ) -> {same};
compare_strings(I, _ , _ ) -> {different, I}.
mám se ještě co učit, v pohodě chápu jak to funguje, ale nevymyslel bych to ...
Chtěl bych se ještě zeptat, jestli se Erlang učíte díky KSP?
backspace, delete…).
Tip na vylepšení: používat Jabber MUC jako „backend“ – udělat z toho telnetové rozhraní k místnosti v Jabberu. BTW: já teď zase pracuji na jednoduchém webovém rozhraní pro jabberové místnosti.
backspace a delete fungují. Teď ještě když nastavím kurzor na (ne za ale na) poslední písmenko řádku a snažím se něco napsat, chová se to „divně“ – jednou se přepíše, jindy se připíše před něj atd.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.