[nem-pl] Mój plan

Michal Moskal malekith at pld-linux.org
Tue Nov 18 13:20:44 CET 2003


On Tue, Nov 18, 2003 at 11:24:18AM +0100, "Paweł W. Olszta" wrote:
> 
> Witam,
> 
> w najbliższym czasie planuję przenieść to co napisałem do SVN'a. Będzie 
> trochę roboty z integracją.
> 
> Chciałbym to zrobić porządnie, więc zacznę od planu:
> 
> 1. dodać typ 'char' i CHAR_LITERAL do leksera i parsera -- trzeba się 
> zastanowić, jak ma taki
> literał wyglądać; zastanowić się jak ma wyglądać konwersja z int w char 
> i odwrotnie [w tej chwili
> w mojej wersji prywatnej pisze się 'A' i lekser zamienia to na 
> NUMBER_LITERAL 65),

Może do NUMBER_LITERAL dodać typ. Tak żeby to obejmowało też 10L i
podobne. Nie sądzę, żeby dodawanie int, char etc na tym samym poziomie
co T_void było wskazane. Raczej je traktować jako typy z biblioteki
standardowej i używanie ich tylko w funkcji do zwijania stałych.

> 2. dodać do parsera ideę wyrażeń stałych -- niech upraszczanie dzieje 
> się w czasie parsowania,

Może później? W trakcie typowania.

> 3. dodać tablice jako native type, odpowiednie typowanie i indeksery na 
> tablicach. Pomyśleć
> o tablicach wielowymiarowych i o tym w jaki sposób z array (int) związać 
> System.Array, tak żeby
> dało się napisać:
> 
> class X {
>  public static _my_array : array (int) = <| 10; -1; 23+(5*7) |>;
> 
>  public static Main () : void {
>    Console.WriteLine ("{0}", _my_array.Length);
>  }
> }
> 
> gdzie _my_array.Length oznacza tutaj (_my_array : System.Array).Length.

Problem jest tylko z tablicami wielowymiarowymi. Normalnie można by
napisać:

class array ('a) extends System.Array = extern "System.Array";

Albo coś podobnego. Gorzej jest z tablicami wielowymiarowymi. Można
zrobić tak:

class array ('a, 'dim) where 'dim :> dim_0 {...}

class dim_0 {}
class dim_succ ('a) where 'a :> dim_0 extends dim_0 {}

> 4. dodać inicjalizację zmiennych statycznych, czyli:
> 
> class X {
>  public static _header : string = "Nemerle v0.1";
>  public static _my_array : array (int) = <| 10; -1; 23+(5*7) |>;
> }
> 
> To działa, modulo punkt 2 (czyli wyrażenia stałe). Przy generatorze kodu 
> w C# to się robi łatwo dla
> typów prymitywnych i tablic, dla skomplikowanych typów (np. list) i przy 
> generatorze do IL'a trzeba
> będzie chyba te inicjalizacje wrzucać do konstruktora statycznego, ale 
> to nie będzie raczej trudne.

Początkowo można wszystko do konstruktora. Potem można jako
optymalizacje znaleźć wyrażenia stałe i wrzucić je do metadanych. Ale
AFAIK nawet CLS nie wymaga od języka korzystania ani tworzenia z
inicjalizatorów w metadanych, więc bez pośpiechu.

> 5. dodać properties do języka, słowa kluczowe get oraz set, to będzie 
> dosyć karkołomne, ale potrzebne
> bo przy istniejącym generatorze raczej nie odwołamy się do żadnych 
> properties z Frameworka, a to boli.

get ani set *nie* są słowami kluczowymi w C#. U nas też nie powinny być.
BTW nie wiem czy nie będzie prościej zmienić najpierw generatora, niż
dodać properties :-) Chyba, że properties będą do tego bardzo potrzebne.

> 6. dodać integrację z Frameworkiem i bibliotekami statycznymi. Przed 
> wczytywaniem DLL'i i analizowaniem
> ich przez System.Reflection raczej nie uciekniemy, ale trzeba się 
> zastanowić czy do samego Frameworka
> nie byłoby dobrze zrobić nagłówków -- pomijać w ten sposób mielenie tych 
> megabajtów bajtkodu za każdym
> razem.

Nie sądze. mcs mieli i jakoś nie widać żeby był przez to strasznie
wolny. Zauważ, że mielisz tylko metadane. Zakładam, że to jest jakoś
sensownie ułożone w tych DLL'ach. Więc to jest kwestia przeczytania
kilkuset kilo danych, które już dawno są w pamięci a nie na dysku (VM is
your friend). Pozatym to już jest zrobione w miarę efektywnie.

> 7. jak już będzie działać 1-6 oraz jak Michał doda matching po stałych 
> (czyli switch), to przerobić lexer.cs
> i parser.jay do Nemerle [Jay'a już przerobiłem (skeleton, reader.c i 
> output.c), parser sie parsuje, w lekserze
> jedna funkcja mi została, wczoraj wieczorem już nie miałem siły jej 
> dokończyć, ale poradziłem sobie bez
> switch'a, co trochę bolało heh].

OK, czyli to dostaje priorytet.

> 8. porządny system mejkfajlów, tak żeby się komplikowało wszystko pod 
> Cygwinem/.NET Framework SDK
> 
> Na pewno o wielu rzeczach tutaj zapomniałem, ale to tak na dobry początek.

Zaraz to wszystko powpisuje w BTS.

-- 
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: PLD Linux ::::::::: Wroclaw University, CS Dept : {E-,w}-- {b++,e}>+++ h




More information about the devel-pl mailing list