Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

Videoannonse
Annonse
Gjest Slettet+9871234

Noen andre som har testet System.Linq.Expressions i .NET? Har laget et scriptspråk med det nå, og det er ganske ålreit å jobbe med.

For de uinvidde, så er Expressions som Boost.Proto, men tillater at koden kompilerer til .NET CIL, og returnerer delegater.

Nå er .NET og .NET CIL gresk for meg, men innebærer

 

Har laget et scriptspråk med det nå

at du faktisk har laget ditt eget skriftspråk eller er det en skrivefeil?

 

For øvrig, er det noen som har prøvd Embarcadere RAD Studio XE2 med støtte for 64 bit, Mac, mobil og mye mer?

Endret av Slettet+9871234
Lenke til kommentar

Noen andre som har testet System.Linq.Expressions i .NET? Har laget et scriptspråk med det nå, og det er ganske ålreit å jobbe med.

For de uinvidde, så er Expressions som Boost.Proto, men tillater at koden kompilerer til .NET CIL, og returnerer delegater.

Nå er .NET og .NET CIL gresk for meg, men innebærer

 

Har laget et scriptspråk med det nå

at du faktisk har laget ditt eget skriftspråk eller er det en skrivefeil?

Har laget et scriptspråk ja. Statisk typet, type inference (direkte og indirekte, ved var, og infer nøkkelordene) og bruker utelukkende lambdauttrykk.

Det er støtte for objektorientering, altså en kan instansiere klasser og bruke egenskaper og funksjoner, men en kan ikke definere egne klasser. Det er ment for å scripte et program som brukes som en styringsenhet.

 

var my_func = lambda() true; // Lag en lambda som alltid returnerer true
var my_value = 100; // Lag variabel my_var, sett datatypen lik resultatet av uttrykket
infer(my_func()) foo; // Lag variabel, sett datatypen lik verdien i infer, og sett verdien til standardverdi for uttrykket.

var func = lambda(int a) a * 2;
var result = "";

while(my_value = func(my_value += if(my_value % 2) 3 else 1) < 200)
{
 result += string(my_value);
}

Helt vilkårlig eksempel for å vise noen av tingene som er implementert og fungerer.

 

Så jeg har laget et domenespesifikt programmeringsspråk, ikke et skriftspråk.

 

Utrolig artig å drive med. Har fått inn en format funksjon som kompilerer inn en string-formatering.

 

Dvs. eksempelvis dette:

 

var value = 93;
return format("Hvis du er ${value} år gammel, men sier du er 0x{value:x} år gammel, så kan det hende du driver med programmering.");

 

Vil kompilere format til følgende (pseudo):

string Block() // Ikke et funksjonskall, men for forklaringens skyld
{
 StringBuilder builder = new StringBuilder();
 builder.Append("Hvis du er ");
 builder.Append(value.ToString());
 builder.Append(" år gammel, men sier du er 0x");
 builder.Append(value.ToString("x")); // Hex
 builder.Append(" år gammel, så kan det hender du driver med programmering.");
 return builder.ToString();
}

 

Noen andre som driver med noe lignende for tiden?

Endret av GeirGrusom
  • Liker 1
Lenke til kommentar
Gjest Slettet+9871234

Du er jammen flink. Skulle ønsket jeg hadde hatt tid til å følge bedre med på det du gjør. I det siste har det vært altfor mye politikk og for lite IT. Jobber med videre med Drupal og jQuery. Har til hensikt til å bli den beste i Norge på det, ihvertfall i Moss på Drupal / jQuery :blush: om helsa holder.

 

Så jeg har laget et domenespesifikt programmeringsspråk, ikke et skriftspråk.

 

Husk at PHP startet som Rasmus Lerdorfs Personal Home Page.

 

Lykke til med fortsettelsen.

 

Regner med at jeg drar på et RAD studio XE 2 seminar i Oslo 22 september. Har fått eget brev om dette fra Alfasoft, så nå ser det ut som Borlands produkter er i bedre hender (ihvertfall på markedsføring) her i landet enn tidligere hvor man måtte til Sverige for å ta kurs og delta på seminarer.

 

http://www.embarcadero.com/products/rad-studio

 

Verdens beste utviklingsplatfrom????????????????

Endret av Slettet+9871234
Lenke til kommentar

Du er jammen flink. Skulle ønsket jeg hadde hatt tid til å følge bedre med på det du gjør. I det siste har det vært altfor mye politikk og for lite IT. Jobber med videre med Drupal og jQuery. Har til hensikt til å bli den beste i Norge på det, ihvertfall i Moss på Drupal / jQuery :blush: om helsa holder.

 

Så jeg har laget et domenespesifikt programmeringsspråk, ikke et skriftspråk.

 

Husk at PHP startet som Rasmus Lerdorfs Personal Home Page.

 

Lykke til med fortsettelsen.

 

Regner med at jeg drar på et RAD studio XE 2 seminar i Oslo 22 september. Har fått eget brev om dette fra Alfasoft, så nå ser det ut som Borlands produkter er i bedre hender (ihvertfall på markedsføring) her i landet enn tidligere hvor man måtte til Sverige for å ta kurs og delta på seminarer.

 

http://www.embarcadero.com/products/rad-studio

 

Verdens beste utviklingsplatfrom????????????????

Bruker ikke embercardeo på jobben, og har ikke egentlig noen interesse av det på hobbybasis. Å utvikle på Mac OS er ganske uinteressant for meg, og .NET gir meg såpass frihet til å gjøre det jeg ønsker at jeg har ikke noen planer om å bytte til Embercardero.

.NET er pålitelig, det har et vanvittig stort standardbibliotek, og er en generelt en veldig fin plattform å utvikle på, med mange forskjellige språk, i flere disipliner, og alt er også veldig moderne.

 

Men jeg trenger ikke, og er ikke interessert i å beskytte .NET eller Microsoft, så jeg foretrekker om vi kan heller diskutere programmeringsspråk generelt. Så har du noen kommentarer til språkdesignet? Det er tenkt ut litt ad-hoc, så hadde vært fint med kommentarer til selve språket :)

 

Det skal som sagt brukes til å scripte et program, for å styre servomotorer og en del annet utstyr. int er 64-bit, og det samme er float grunnet at dette er hva som brukes i programmet internt.

Lenke til kommentar
Gjest Slettet+9871234

Så har du noen kommentarer til språkdesignet? Det er tenkt ut litt ad-hoc, så hadde vært fint med kommentarer til selve språket :)

 

Jeg likte denne :thumbup:

 

while(my_value = func(my_value += if(my_value % 2) 3 else 1) < 200)
{
 result += string(my_value);
}

 

Den neste blokken

 

string Block() // Ikke et funksjonskall, men for forklaringens skyld
{
 StringBuilder builder = new StringBuilder();
 builder.Append("Hvis du er ");
 builder.Append(value.ToString());
 builder.Append(" år gammel, men sier du er 0x");
 builder.Append(value.ToString("x")); // Hex
 builder.Append(" år gammel, så kan det hender du driver med programmering.");
 return builder.ToString();
}

 

minner meg bortsett fra (new) om moderne JavaScript og er helt OK og sikkert minimalistisk / rask.

Endret av Slettet+9871234
Lenke til kommentar

Har laget et scriptspråk ja. Statisk typet, type inference (direkte og indirekte, ved var, og infer nøkkelordene) og bruker utelukkende lambdauttrykk.

Det er støtte for objektorientering, altså en kan instansiere klasser og bruke egenskaper og funksjoner, men en kan ikke definere egne klasser. Det er ment for å scripte et program som brukes som en styringsenhet.

 

var my_func = lambda() true; // Lag en lambda som alltid returnerer true
var my_value = 100; // Lag variabel my_var, sett datatypen lik resultatet av uttrykket
infer(my_func()) foo; // Lag variabel, sett datatypen lik verdien i infer, og sett verdien til standardverdi for uttrykket.

var func = lambda(int a) a * 2;
var result = "";

while(my_value = func(my_value += if(my_value % 2) 3 else 1) < 200)
{
 result += string(my_value);
}

 

Synes sånt som dette er veldig morsomt. Har desverre ikke fått gjort så mye praktisk rundt dette selv.

 

Noen spørsmål:

  • Garanteres det "proper tailcall" (aka tail-call optimization)? Hvis så, hvordan har du implementert det?
  • Kompileres hele programmet i et stort jafs, eller kompileres det inkrementielt? Lurer på hvordan du gjør det med det globale skopet.

Hadde vært morsomt å vite hva slags typesystem språket har, og hva slags type inference-algoritme du bruker.

  • Liker 1
Lenke til kommentar

Så har du noen kommentarer til språkdesignet? Det er tenkt ut litt ad-hoc, så hadde vært fint med kommentarer til selve språket :)

 

Jeg likte denne :thumbup:

 

while(my_value = func(my_value += if(my_value % 2) 3 else 1) < 200)
{
 result += string(my_value);
}

 

Den neste blokken

 

string Block() // Ikke et funksjonskall, men for forklaringens skyld
{
 StringBuilder builder = new StringBuilder();
 builder.Append("Hvis du er ");
 builder.Append(value.ToString());
 builder.Append(" år gammel, men sier du er 0x");
 builder.Append(value.ToString("x")); // Hex
 builder.Append(" år gammel, så kan det hender du driver med programmering.");
 return builder.ToString();
}

 

minner meg bortsett fra (new) om moderne JavaScript og er helt OK og sikkert minimalistisk / rask.

Det er gjengivelse av kompilert resultat i C#. Bare en representasjon av et eksempel på en ekvivalent til format() for det gitte eksempelet er. Det skal gå ganske lynkjapt, fordi det skjer overhode ingen parsing runtime (ettersom dette blir gjort compile time) så ideelt sett skal funksjonen være raskere enn sprintf i C (som er ekvivalent funksjon) fordi det er ikke egentlig en funksjon.

 

Har laget et scriptspråk ja. Statisk typet, type inference (direkte og indirekte, ved var, og infer nøkkelordene) og bruker utelukkende lambdauttrykk.

Det er støtte for objektorientering, altså en kan instansiere klasser og bruke egenskaper og funksjoner, men en kan ikke definere egne klasser. Det er ment for å scripte et program som brukes som en styringsenhet.

 

var my_func = lambda() true; // Lag en lambda som alltid returnerer true
var my_value = 100; // Lag variabel my_var, sett datatypen lik resultatet av uttrykket
infer(my_func()) foo; // Lag variabel, sett datatypen lik verdien i infer, og sett verdien til standardverdi for uttrykket.

var func = lambda(int a) a * 2;
var result = "";

while(my_value = func(my_value += if(my_value % 2) 3 else 1) < 200)
{
 result += string(my_value);
}

 

Synes sånt som dette er veldig morsomt. Har desverre ikke fått gjort så mye praktisk rundt dette selv.

 

Noen spørsmål:

  • Garanteres det "proper tailcall" (aka tail-call optimization)? Hvis så, hvordan har du implementert det?
  • Kompileres hele programmet i et stort jafs, eller kompileres det inkrementielt? Lurer på hvordan du gjør det med det globale skopet.

Hadde vært morsomt å vite hva slags typesystem språket har, og hva slags type inference-algoritme du bruker.

Jeg har ikke implementert noen tail-call optimalisering, men tenkte rett og slett gjøre et tail-call til en lopp konstruksjon. Det er jo en ganske simpel operasjon, ettersom det ikke er noe poeng i å bevare argumentene på en stack, så det skal være å båre overskrive argumentene med det nye kallet, og gå tilbake til start. Så et tail-rekursivt kall vil i virkeligheten være syntaktisk sukker for en loop som på slutten overskriver argumentverdiene.

Men jeg tenkte da to forskjellige måter å skrive det på:

var foo = lambda()
{
 foo();
}
// eller
var foo = lambda()() // Syntaktisk sukker for den over
{
}

Type-systemet er det samme som .NET bruker, ettersom det er den run-timen det kjører på. Inference er ganske simpelt på variabler, ettersom datatyper propegerer i uttrykkstreet allikevel, men krever litt mer arbeid i funksjoner. Generelt sett så gjetter den etter beste evne, og hvis du skriver noe som er tvetydig (forskjellige typer som ikke er kompatible blir returnert) så får du en syntax error, som en må rette med en cast eller lignende.

Jeg er ikke helt ferdig med type inference i funksjonskall, men idéen der er at et lambdauttrykk i virkeligheten er kun en prototype når den blir definert, og kan variere dersom den blir kalt med forskjellige datatyper. Det som er tenkt er da en restrukturering av uttrykkstreet hvor argumenter rekursivt erstattes når compileren har klart å dedusere alle parametertyper. Parametertyper dedusere utifra alle tilegnelser som blir gjort mot dem.

Tenkt da er at en skriver følgende:

var foo = lambda(var a, var b) a + b;[code]
I virkeligheten skal dette bli oversatt til
[code]Func<GenericType, GenericType> foo = (a, b) => a + b;

Og hvis funksjonen brukes, så oversettes den til en funksjon med rette argumenter.

  • Liker 1
Lenke til kommentar

Har laget et scriptspråk ja.

Spennende!

 

Hvordan er parseren implementert? Recursive-descent for hånd, lexx/yacc-generert (elns.), eller parserkombinatorer?

Recursive-descent for hånd. Det er ikke egentlig så komplisert å gjøre allikevel. Tenkte skrive en guide om hvordan jeg har gjort det etterhvert.

 

Har også nå laget en parser for BASIC grunnet at jeg ble fortalt på jobb at BASIC var blitt ganske de-facto i bransjen jeg er i grunnet at en av de største leverandørene bruker det.

Dessverre synes jeg, både fordi BASIC er relativt vanskelig å skrive en korrekt parser for (i forhold til C språk). Jeg hater at whitespace er viktig, fordi fra parseren sin side så må jeg legge inn kunstige krav om newline.

 

Så det gjorde at jeg måtte bytte fra tokenizer.Tokenize(kode).Where(token => !(token.IsWhiteSpace() || token.IsComment())) til en som ikke filtrerer ut whitespace med newline.

FOR setningen i BASIC er også litt vrien å kompilere, fordi det i utgangspunktet er et uttrykk for om resultatet er innenfor en gitt mengde, fremfor i C hvor det er et helt vilkårlig uttrykk.

 

Altså det jeg tenker på er denne:

For i As Integer = 0 To 100
 ' Kode
Next

 

Det jeg gjorde, var å kompilere conditional-uttrykket til følgende:

 

var min = {0}, var max = {100};
if(min > max)
{
 var temp = min;
 min = max;
 max = min;
}
return i >= min && i <= max;

 

Har fått den til å fungere ganske bra nå dog, så neste prosjekt er å se om det er mulig å kompilere .NET CIL til ARM Thumb på en enkel måte (det skal scripte maskinvare også som kjører på ARM åpenbart)

Muligens Mono har noe som kan brukes?

  • Liker 1
Lenke til kommentar

Ulempen med recursive decent er at det ofte blir noe ustrukturert. Man starter i en ende og koder i vei. Underveis oppdager man at man har en del tvetydigheter i gramatikken osv.

 

Med parser generatorer som PCCTS og ANTLR så må man jo skrive gramatikken og får man litt bedre oversikt og oppdager ofte slike problemer på et litt tidligere stadium.

 

Ulempen med PCCTS (Purdue Compiler-Compiler Tool Set) er at man sikkert raskt havner på PST's liste over mulige terrorister...

Lenke til kommentar

Jeg prøver å implementere mergesort i Python3, men jeg får ikke ceil() og floor()-funksjonen til å fungere. Noen som kan hjelpe meg?

 

def merge(left, right):
   result = []
   i ,j = 0, 0
   while i < len(left) and j < len(right):
       if left[i] <= right[j]:
           result.append(left[i])
           i += 1
       else:
           result.append(right[j])
           j += 1

   result += left[i:] #Hva betyr dette (i:)?
   result += right[j:]
   return result

def mergesort(list):
   if len(list) < 2:
       return list
   else:
       middle = len(list) / 2
       left = mergesort(list[floor(middle)]) #Her fungerer det ikke
       right = mergesort(list[ceil(middle)])
       return merge(left, right)


print(mergesort([3, 4, 8, 0, 6, 7, 4, 2, 1, 9, 4, 5])) #Får også feil syntaks her.

Endret av haarod
Lenke til kommentar

result += left[i:]

Les her

 

Å bruke : er en måte å hente "fra element"/"til element" i python.

 

Ang. floor greiene er jeg ikke helt sikker. Men prøv å importere math, og så bruke math.floor

 

import math

math.ceil(ll)

math.floor(ll)

 

(nå kan jeg ikke så mye mer python enn det jeg har lært meg for algdat, men)

Endret av Matsemann
Lenke til kommentar

Har desverre ikke sjekket programmet ditt, men det kan være et klassisk eksempel på hvilken galskap det er å bruke et diktatorspråk som forandrer semantikken plutselig fra en versjon til en annen:

 

 

$ cat ceil.py 
import sys
import math

val=len("abc")/2
sys.stdout.write("result is " + str(math.ceil(val)) + "\n")
$ python2.7 < ceil.py 
result is 1.0
$ python3.1 < ceil.py 
result is 2

 

La oss håpe at det ikke er Python som styrer atomreaktoren i ditt nabolag.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...