[nem-pl] Uwagi różne

Kamil Skalski nazgul at omega.pl
Wed Feb 18 23:11:37 CET 2004


On Wednesday 18 of February 2004 22:25, Marcin 'Qrczak' Kowalczyk wrote:
> W liście z śro, 18-02-2004, godz. 22:14, Marcin 'Qrczak' Kowalczyk
>
> pisze:
> > mamy podobne gusta w sprawach składni definicji zmiennych i
> > funkcji, średników, klamer, stopnia funkcyjności (też mam mutable i
> > immutable wiązania, domyślnie immutable), nawet konwencji wielkości
> > liter (u Was przez .NET, u mnie niezależnie):

:) join us 

>
> I jeszcze jedno - makra :-)  Pomyślicie, że to plagiat, ale niezależnie
> od Was wymyśliłem wyrażenia i wzorce tworzące i rozpoznające cytaty
> kodu, ze znakami $ w środku oznaczającymi ucieczkę do metajęzyka
> (i w wyrażeniach, i we wzorcach).

To już chyba tak jest, że gdy ktoś coś wymyśli (Meta-Haskell, Meta-ML), to 
idee szybko się rozprzestrzeniają i zostają ulepszane. System cytowania jest 
rzeczywiście całkiem zgrabny i jest to niewątpliwe jakiś krok ku perfekcji od 
tego co mamy w Haskellu.

W tej chwili wyzwaniem dla nas jest wymyślenie czegoś ładnego do operacji na  
definicjach typów:
mamy klasy Produkt, ProduktDuzy, .... i chcemy napisać makro, które doda do 
nich metodę DumpToFile zapisującą wartości pól klasy gdzieś tam.
Myśleliśmy kiedyś, żeby zorobić:
match (c) {
| <[ class $name { ... $elements } ]> =>
  foreach (element in elements) {
     tworzymy listę pól
  };
  <[ public $("DumpToFile" : var) : void {
           $(wykorzystujemy listę)
       }
    ]>
| _ => ...
}

ale doszliśmy do wniosku, że cytowanie deklaracji nie ma sensu, bo są zbyt 
nieregularne.

Skłaniamy się ku czemuś w stylu
def l = c.Fields ();
def body = <[ $(uzywamy l) ]>;
c.AddMethod ("DumpToFIle", <[ type : void ]>, body);

Kiedyś myślałem o takim cytowaniu, które pozwoliłoby cały program zamknąć w 
jednym <[ ... ]>, ale ze względów praktycznych chyba to jest bezcelowe...

>
> <http://nemerle.org/macros.html> nie opisuje sprawy higieny
> identyfikatorów. Jest gdzieś opis, jak to się zachowuje? Mam pewne

Dużo więcej o makrach jest w pracy, którą piszę 
(http://www.nemerle.org/metaprogramming.ps). Tam jest napisane, że higiena 
makr jest i rzeczywiście niedługo będzie. Oczywiście da się ją ominąć
<[ def f (x) { x + "aa"}; f ("bb") ]>   tu x i f będzie przemianowane

<[ def $("g" : var) (x) { x + "aa" }; $("g" : var) ("bb") ]> a tutaj 'g' 
zostanie wklejone w wynikowy kod takie jakim jest.

Będzie też rozwijanie nazw do ich pełnej nazwy
<[ E_ref (...) ]>
to tak naprawdę 
<[ Nemerle.Compiler.Parsetree.E_ref (...) ]>

zastanawia mnie tylko jedna rzecz, którą uporczywie panowie od Haskella 
powtarzają tu i tam:
def x = <[ 1 ]>;
def y = <[ x + 5 ]>

to u nich jest całkiem sensowny kod, a wg nas to totalne pomiszanie języka z 
meta-językiem, u nas musi być
def x = <[ 1 ]>;
def y = <[ $x + 5 ]>

Kamil




More information about the devel-pl mailing list