Ero sivun ”D (ohjelmointikieli)” versioiden välillä

[arvioimaton versio][arvioimaton versio]
Poistettu sisältö Lisätty sisältö
Demise (keskustelu | muokkaukset)
p korjauksia
Demise (keskustelu | muokkaukset)
esimerkkejä
Rivi 37:
 
== Esimerkkejä ==
Avainsanat ovat {{color|blue|sinisellä}}, merkkijonot {{color|red|punaisella}}, kommentit {{color|green|vihreällä}}.
 
===Hei maailma===
Tämä esimerkki kirjoittaa ruudulle sanat "Hei maailma!" ja sen jälkeen komentorivin argumentit.
Jokaisen D-ohjelman suorittaminen alkaa <tt>main</tt> funktiosta, ja <tt>args</tt>
on merkkijonojen taulukko, jossa komentorivin argumentit ovat. Argumentit ovat valinnaisia.
Merkkijonoa kuvataan D:ssä kirjaintaulukkonatyypillä <tt>string</tt>. D 1.x:ssä string on alias merkkijonojen taulukolle(<tt>char[]</tt>), mutta 2.x Tällöinestää useidenmerkkijonon muokkaamisen. Useiden merkkijonojen taulukko on vastaavasti <tt>char[]string[]</tt>.
 
<source lang="D">
{{color|blue|import}} std.stdio; {{color|green|//tuodaan tuo writefln() -funktio}}
{{color|blue|int}} main({{color|blue|char}}[][] args)
{
writefln({{color|red|"Hei maailma!"}});
{{color|blue|foreach}}({{color|blue|int}} i, {{color|blue|char}}[] a; args)
writefln({{color|red|2="args[%d] = '%s'"}}, i, a);
{{color|blue|return}} 0;
}
 
int main(string[] args)
<tt>foreach</tt> lausekkeella voidaan käydä läpi mikä tahansa kokoelma. Vakiotietotyypit tarjoavat oletustoiminnallisuuden, mutta iterointi voidaan tarvittaessa erikoistaa määritellyissä luokissa.
{
writefln({{color|red|"Hei maailma!"}});
foreach(indeksi, arvo; args)
writefln({{color|red|2="args[%d] = '%s'"}}, iindeksi, aarvo);
{{color|blue|return}} 0;
}
</source>
 
<tt>foreach</tt> lausekkeella-lauseella voidaan käydä läpi mikä tahansa kokoelma. Vakiotietotyypit tarjoavat oletustoiminnallisuuden, mutta iterointi voidaan tarvittaessa erikoistaa määritellyissä luokissa. Lause päättelee indeksin ja arvon tyypit automaattisesti, mutta ne voidaan myös ilmoittaa.
 
===Hajautustaulukot===
Esimerkki havainnollistaa hajautustaulujen käyttöä monimutkaisen tietorakenteen rakentamisessa.
 
<source lang="D">
import std.stdio; // tuo writefln()
 
int main(string[] args) {
// Määritellään hajautustaulu, jossa arvoina on taulukoita merkkijonoista ja
// avaimena merkkijono
string[] [string] säiliö;
 
// Lisätään säiliöön henkilöitä ja heille esineitä
säiliö["Tuomikki"] ~= "puukko";
säiliö["Airikka"] ~= "löylykauha";
säiliö["Tuomikki"] ~= "puhelin";
 
// Käydään läpi säiliön henkilöt
foreach (string henkilö, string[] esineet; säiliö)
kerro_montako_esinettä(henkilö, esineet);
return 0; // ohjelma onnistui
}
 
void kerro_montako_esinettä(string henkilö, string[] esineet) {
writefln(person, " kantaa ", items.length, " esinettä.");
}
</source>
 
===Metaohjelmointi===
Esimerkki näyttää, miten D mahdollistaa koodin suorittamisen käännösaikana.
 
<source lang="D">
// Malli, joka esittelee static if -lauseen käyttöä.
template Kertoma(ulong n) {
static if( n <= 1 )
const Kertoma = 1;
else
const Kertoma = n * Kertoma!(n-1);
}
 
// Vertailun vuoksi kertomafunktio
ulong kertoma(ulong n) {
if( n <= 1 )
return 1;
else
return n * kertoma(n-1);
}
 
// mallin instantiointi, paluuarvon evaluointi,
// tyypin päättely ja vakion asetus
const kert_7 = Kertoma!(7);
 
// käännösaikainen funktion suoritus,
// tyypin päättely ja vakion asetus
const kert_9 = kertoma(9);
 
// arvoja voidaan tulostaa näytölle käännösaikana ja muotoilla
// esimerkiksi printf-tyylisellä Format-mallilla
import std.metastrings;
pragma(msg, Format!("7! = %s", kert_7));
pragma(msg, Format!("9! = %s", kert_9));
 
// käännös voidaan keskeyttää esimerkiksi virhetilanteissa
static assert(kert_7 != 5040, "Laskualgoritmi on virheellinen");
</source>
 
== Aiheesta muualla ==