[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