🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.funkcyjne
Article #415

Re: Mozart-OZ

#415
From: DecatonE
Date: Sat, 04 Oct 2003 17:44
105 lines
3696 bytes
Andrzej Wasowski...

> Niestety nie mam czasu się za to wziąć, ale jakbyś opisał na grupę
> swoje doświadczenia, plus jakieś ciekawsze elementy kodu -- to ja
> bardzo chętnie.

Ok...

Na początek powstrzymuję się od szerszych opinii.

Język wydaje się być rozbudowany, pomysłowy i wydajny, zwłaszcza
jeżeli chodzi o programowanie wielowątkowe.

W praktyce wygląda to na połączenie "lispa" (paradygmat funkcjonalny)
z elementami obiektowymi + jakieś inne pomysły, których jeszcze
nie rozgryzłem (cells, junks (tu są mapy, słowniki etc.), port
(komunikacja) i inne)...

Ciekawsze fragmenty kodu z tutoriala:

declare Insert in
proc {Insert Key Value TreeIn ?TreeOut}
   case TreeIn
   of nil then TreeOut = tree(Key Value nil nil)
   [] tree(K1 V1 T1 T2) then 
      if Key == K1 then TreeOut = tree(Key Value T1 T2)
      elseif Key < K1 then T in 
        TreeOut = tree(K1 V1 T T2)
        {Insert Key Value T1 T}
      else T in 
        TreeOut = tree(K1 V1 T1 T)
        {Insert Key Value T2 T}
      end 
   end 
end
declare Tr1 Tr2 Tr3 in
{Insert 10 a nil Tr1}
{Insert 16 c {Insert 15 b Tr1} Tr2}
{Browse Tr2}

Figure 5.3: Tree insertion using case statement

Mała legenda (i dużo się wyjaśni):

"declare Insert in [...]" - wprowadzenie zasięgu dla zmiennej Insert
(do końca pliku chyba) - inna wersja "local Insert in [...] end".

Insert - nazwa procedury
Key, Value, TreeIn - parametry wejściowe
TreeOut - parametr wyjściowy

Wywołanie funkcji {Nazwafunkcji par1 par2 parWyj},
czasami opuszcza się parWyj, tu jest dowolność, ale
nie jestem pewien do końca czemu (podejrzewam, że żeby
umożliwić kilka par. wyjściowych).

case E of Pattern_1 then S1 
[] Pattern_2 then S2 
[] ... 
else S end

To wyżej to wiadomo.

TreeOut = tree(K1 V1 T T2)
Utworzenie krotki.

Funkcja {Browse param} wypisuje w oknie wartość parametrów.
Dla w/w przykładu wypisze:

tree(10 a nil tree(15 b nil tree(16 c nil nil)))

Czyli drzewko...


Inny przykład:

declare Map in
fun {Map Xs F}
   case Xs
   of nil then nil
   [] X|Xr then {F X}|{Map Xr F}
   end 
end 
{Browse {Map [1 2 3 4] fun {$ X} X*X end}}


Funkcja Map przyjmuje na wejściu dwa parametry:
Xs i F, pierwszy to lista (tu: [1 2 3 4])
po której sobie rekurencyjnie chodzi wywołując
dla każdego elementu funkcję F poprzez: {F X}.
Miłe, szybkie i przyjemne :)

Tu wynik [1 3 9 16]

Wątki tworzy się tak:
thread [...] end 
:)


Tyle z podstaw.

adam
-- 
[ rectifier[X]mesa.eu.org : mail ]
[  http://www.mesa.eu.org : home ]
Technical Details
Message-ID: <Xns940AC8C0FF73Dzdomu@127.0.0.1>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
References: <Xns940A1B5DFE2AEzdomu@127.0.0.1> <s99ekxtc6rx.fsf@localhost.localdomain>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
From: DecatonE <news01@skasuj.mesa.eu.org>
Newsgroups: pl.comp.lang.funkcyjne
Subject: Re: Mozart-OZ
Date: Sat, 04 Oct 2003 19:44:05 +0200
Organization: news.onet.pl
Lines: 105
Sender: szladam@poczta.onet.pl@vf28.neoplus.adsl.tpnet.pl
Message-ID: <Xns940AC8C0FF73Dzdomu@127.0.0.1>
References: <Xns940A1B5DFE2AEzdomu@127.0.0.1> <s99ekxtc6rx.fsf@localhost.localdomain>
NNTP-Posting-Host: vf28.neoplus.adsl.tpnet.pl
Mime-Version: 1.0
X-Trace: news.onet.pl 1065289447 2611 80.50.233.28 (4 Oct 2003 17:44:07 GMT)
X-Complaints-To: abuse@onet.pl
NNTP-Posting-Date: 4 Oct 2003 17:44:07 GMT
User-Agent: Xnews/5.02.24 Mime-proxy/1.2.c.0 (Win32)
X-face: %*W*;[JzU~jUlkH7O[py6D%P#eC9KGNQ`l@KoUxem0i7wJ^/!"gQ>`|Te[Xc-.pl%si91W-SanXs.v\xIwAf"Di#x2HzXPusLGo{Ei-/CQ,JT`Zn,v$S"w$kx$314_{dp77-e\${a0Y^Vs#(bFH9fejN_FJRRdxYjt{_>qI`fwo164Ygx3Y-pdW&>oXqKrLH?Po^TUr'TV&7j}vgcZ[jP=&"xzB*.*KnSyJ_h~
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit