[nem-pl] proponowane (przeze mnie) projekty

Michal Moskal malekith at pld-linux.org
Sun Sep 28 17:41:53 CEST 2003


Ponieżej zamieszczam opis. Proszę Andrzeja, Grzesia i Łukasza o
uczynienie podobnie (cc: na devel-pl bo tam jest już ładne archiwum, a
tu takie sobie).

Wstęp
~~~~~

O rozszerzeniach (obu typów) w innych językach można poczytać:

  Camlp4: 
    http://caml.inria.fr/camlp4/index.html
  Meta-Haskell: 
    http://research.microsoft.com/Users/simonpj/papers/meta-haskell/meta-haskell.ps

Warto oczywiście poszukać, może ktoś jeszcze miał jakieś fajne pomysły.


Rozszerzenia semantyczne
~~~~~~~~~~~~~~~~~~~~~~~~

W zamyśle mają być to makra na sterydach.  Mają umożliwiać łatwe pisanie
specjalnych funkcji jak np. bezpieczny pod względem typów printf,
przykładowo wywołanie:

  printf ("foo%s%d", x, y)

ma być zamieninane na:

  print_string ("foo");
  print_string (x);
  print_int (y);
  
Inny przykład to bezpieczne wyrażenia regularne:
 
  rxmatch ("([0-9]*):([0-9]*):([0-9]*)", str, h, m, s)

jest zamieniane na:

  let gr = Regexp.match("([0-9]*):([0-9]*):([0-9]*)", str) in
  let h = gr#group(1) in
  let m = gr#group(2) in
  let s = gr#group(3) in
  ...

czy coś podobnego.

To są proste przykłady, ale same w sobie znacząco ulepszają
język. Bardziej skomplikowany przykład:

	attr("xmlserialize") class Foo {
	  int i;
	  Bar b;
	  ....
	}

zamieniane na:

	class Foo {
	  int i;
	  Bar b;
	  
	  method serialize() : Xml.Tree =
	    Xml.Tree("Foo", [serialize_int(i); b#serialize()]);
	  ...
	}

Zaznaczam, że *nie* chodzi o zaimplementowanie jakiś konkretnych
rozszerzeń (jak np. te które opisałem), tylko wymyślenie i późniejszą
implementację w kompilatorze ogólnej metody ich opisu.


Rozszerzenia składniowe
~~~~~~~~~~~~~~~~~~~~~~~
1. Trzeba przemyśleć sprawę jakich rozszerzeń składniowych potrzebujemy.
2. Rozszerzenia lexera.
3. Rozszerzenia parsera.

Tu również chodzi o ogólną metodę.

Proste przykłady rozszerzeń składniowych to np. pętla while
(zmieniana na ogonowo-rekurencyjną funkcję), czy też specjalna składnia
do wyrażeń regularnych:

  let (h, m, s) = str =~ /([0-9]*):([0-9]*):([0-9]*)/

czy coś podobnego.

Co do lexera, być może wystarczy kilka metod quotowania, warto przeczytać jak
jest to zrobione w perlu:

  http://www.perldoc.com/perl5.6/pod/perlop.html#Quote-and-Quote-like-Operators

(to z 'man perlop')

Niemniej jednak, nie chce widzieć w języku czegoś aż tak zakręconego :-)


Dokumentacja języka
~~~~~~~~~~~~~~~~~~~
Trzeba napisać:

1. Opis gramatyki języka, konstrukcja po kontrukcji z krótkim suchym
   opisem.
2. Tutorial step-by-step.

Koniecznie po angielsku, może być dodatkowo po polsku.

Jaki koń jest każdy widzi -- opis na stronie jest niekompletny i
nieaktualny.

Będę opowiadał na wykładach o języku, w razie wątpliwości co do semantyki
konstrukcji (bo gramatykę można znaleźć w źródłach kompilatora), proszę
pytać na liście.

Dobrze by było gdyby zabrał się za to ktoś (kilku ktosiów?) z a) dobrą
znajomością angielskiego, b) darem klarownego wyjaśniania zawiłych
konceptów.


-- 
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: When in doubt, use brute force. -- Ken Thompson : {E-,w}-- {b++,e}>+++ h





More information about the devel-pl mailing list