har pillat på en egen liten kompilator ett tag nu och idag kompilerade jag och testade min första klass skriven i mitt eget språk :) Ja, jag har ett bra förslag i Smalltalk kan du ha parametrarna inne i metodnamnet... vilket gör att koden blir grymt lätt att läsa. Varje inparameter har : före sig så man kan tänka sig en metod som heter Rename: string aName To: string anotherName (metoden heter egentligen Rename:To: och har två parameterar (aName och anotherName)... Kul grej! Ja precis. Mycket av denna "design by contract" går att göra med ett mer avancerat typsystem. kan du förklara vad du menar med det där? Nu har jag ingen erfarenhet av Eiffel och har inte heller orkat läsa genom någon tutorial, så jag kan inte avgöra om det går att göra "mer" saker med Cayennes typsystem än i Eiffel.Mitt eget språk :P
kompilatorn emittar kod via ett visitor interface så
för närvarande emittas koden till c# som sedan kompileras
men tanken är att göra en ny emitter som emittar .net cil kod direkt
det kanske låte lite fånigt att den emittar till c# men den parsar all kod och skapar ett DOM träd för alla olika konstructs , tex forloopar och expressions som emittern sedan spottar ut på rätt sätt.
så det är inget litet find replace trick :P
såhär såg iaf min första klass ut :
class TimeOfDay
{
int h;
int m;
int s;
proc void SetHour (int hour)
{
require
{
hour < 24;
hour >= 0;
}
body
{
h = hour;
}
ensure
{
h == hour;
m == old.m;
s == old.s;
}
}
proc void SetMinute (int minute)
{
require
{
minute < 60;
minute >= 0;
}
body
{
m = minute;
}
ensure
{
m == minute;
h == old.h;
s == old.s;
}
}
proc void SetSecond (int second)
{
require
{
second < 60;
second >= 0;
}
body
{
s = second;
}
ensure
{
s == second;
h == old.h;
m == old.m;
}
}
proc void SetTime (int hour,int minute,int second)
{
require
{
}
body
{
SetHour(hour);
SetMinute(minute);
SetSecond(second);
}
ensure
{
}
}
}
Require och Ensure tänket är stulet rakt av från Eiffel (Design By Contract)
om någon har några mer kul förslag på features så säg till :)
alltid kul att testa hur lurigt det är att få till det.
//Roger
Sv: Mitt eget språk :P
Det är säkert inte helt lätt men ett grymt sätt att få läsbar kod...Sv: Mitt eget språk :P
Saknar Eiffels Design By Contract, någon som vet hur det kommer sig att det inte slagit igenom i t ex C# och andra språk som konstruerats efter Eiffel? Finns det några uppenbara nackdelar som jag missat? Det är över 10 år sedan jag kodade Eiffel så jag har inte så bra koll på hur det fungerade där rent tekniskt.
Ps. Hur ser den genererade C#-koden ut? Kastar du ett exception om Require misslyckas?Sv: Mitt eget språk :P
varje require och ensure expression blir i princip
if ((expression)==false)
throw new Exception("yaddayadda"));
att DbC inte slagit igenom i tex C# kan kanske bero på att det ställer lite speciella krav.
tex för att kunna jämföra en medlemsvar med hur den såg ut innan anropet kräver ju att en kopia tas på hela objektet i början av varje anrop , som man sedan kan använda för att jämföra om något ändrats.
det skulle ju självklart leda till sunkig prestanda i stora objekthirarkier så det kan ju vara en del av problemet.
men förutom det så tycker iaf jag att det verkar väldigt trevligt.
(men det finns säkert andra problem med det oxo...)
//RogerSv: Mitt eget språk :P
http://www.cs.chalmers.se/~augustss/cayenne/Sv: Mitt eget språk :P
går det göra mer saker i cayenne än i tex eiffel eller vad är det du syftar på?Sv: Mitt eget språk :P
Ett exempel på vad man kan göra är att ange att en funktion sorterar en lista. Skulle funktionen inte göra det, så får man ett typfel vid kompileringen.
Man kan också ge printf (som finns i C) en typ som kontrollerar att antalet bifogade värden stämmer överens med antalet som anges av strängen. (Ex. printf("%d %f", ...) skall ha ett heltal och ett flyttal som argument.) Har man skickat med fel antal eller fel typer får man ett typfel vid kompileringen.