flang - Uusi ohjelmointikieli

Liittynyt
05.11.2017
Viestejä
102
Kehitin uuden funktionaalisen kielen: flang.
GitHub - mystikkogames/flang: flang - a functional language
Kieli on kirjoitettu C:llä.
flang on täysin harrasteprojekti, ei mitään kaupallisia tavoitteita.
Eulerit on tärkeitä kehityksessä. Niiden pitää tuottaa oikeat tulokset joka kerta. Ja optimoin flangia nopeammaksi. Joten suoritusajatkin pitäisi laskea!

Esimerkki flang-koodia.
Koodi:
( function :euler_1 ( ) :
    ( $sum 0 = )
    ( $i 1 = )
    ( loop ( $i 1000 < ) :
        ( if ( $i 5 % 0 == $i 3 % 0 == or ) :
            ( $sum $i += )
        )
        ( $i ++ )
    )
    ( $sum )
)
 
Ihan näppärä taidonnäyte mutta pakko todeta, että en ainakaan tässä vaiheessa osaa arvostaa muuttujien helppoa näkemistä tai postfix-merkintätapaa. :D
 
Pakko sanoa että kaikki mitä ohjelmoinnissa on itsellä antaa, on flangissa kiinni. jsewel meni maaliin vanhoilla merkeillä suht helposti. Mutta flang on paljon kovempi projekti kuin html5-pelit.

Joo laitoin muuttujille $-merkin ihan sen takia että se on helpompi parsia. Postfix saattaa tuntua oudolta jos on tottunut infixiin.

flang muuttuu parempaan suuntaan kokoajan. Sain vihdoin ja viimein regexit kirjoitettua kunnolla. Nyt sinne on helppoa lisätä jonkin verran toimintoja.
flang/unit_tests.flang at master · mystikkogames/flang · GitHub
 
Viimeksi muokattu:
Sain eilen lisättyä lambdat flangiin. eulereita flang ratkaisee jo 18. flangin rakenne on niin hyvä että rekursiiviset funktio kutsut ja lambdat vaativat vain n. 20 riviä eleganttia koodia.

Mielestäni flangin lambdat on aika nätit. =>
flang/euler_problems.flang at master · mystikkogames/flang · GitHub

lambdat voi myös antaa parametreinä toisille lambdoille. Sekä sijoitella muuttujiin jne.
Koodi:
( $cruncher ( lambda ( $func1 $func2 ) : ( $a :$func1 = ) ( $b :$func2 = ) ( if ( $a $b > ) : ( $a ) else : ( $b ) ) ) = )
# We can pass lambdas as arguments to functions!
( ( lambda ( ) : ( 11 ) ) ( lambda ( ) : ( 42 ) ) :$cruncher 42 == *assert )
 
Tuo flang on clang - kääntäjä ( ja paljon muuta ) kirjoitettuna Fortranilla. Ei mitään yhteistä oman flang - kielen kanssa. Voit tietysti kokeilla ajaa euler_problems.flang tuolla kääntäjällä. Jos toimii niin voinkin lopettaa oman kääntäjän kehittämisen. :)
 
Kirjoittelin flangiin gfx-kirjaston alun.
Rosetta-koodin esimerkki flangilla. 16 riviä vain. Täysin sama kuva kuin muillakin kielillä:
[Imgur](https://i.imgur.com/lWyqS55.png)

44 riviä flangia ja nätti Mandelbrot. Koodi joka luo mandelbrotin ja tallentaa sen.
flang/examples.flang at master · mystikkogames/flang · GitHub
ZEJaYid.png
 
Näyttää siltä kuin jotakin obfuscated Perliä olisi vatkattu yhteen Lispin kanssa. Suoraan sanoen, en muista yhtä karmaisevaa syntaksia nähneeni missään muualla kuin (muissa) esoteerisissa kielissä.
 
Paitsi että Lispillä ei ollut mitään vaikutusta flangiin. En ikinä ole ohjelmoinut Lispillä mitään. Kieli joka vaikutti flangiin on assembly. Kieli jonka päällä pyörii kaikki kielet. Koodasin assemblyllä ja huomasin että tämä stack-tyylinen ohjelmointihan on itse asiassa loogista. 0.87:ssa Hashasin funktiot ja muuttujat ja 19 Euleria meni 165s -> 53s. Ei paljon häpeä Rubylle ja Pythonille. Ellei ole jo nopeampi.

Rosettacoden:
Bitmap/Write a PPM file - Rosetta Code
Vastaava toteutus 16 rivillä flangia. Mikä tuossa on ei ymmärrettävää?
flang/examples.flang at master · mystikkogames/flang · GitHub
 
Siivosin turhaa roskaa pois. flangin tietotyypi - json oli alunperin 800 riviä. Kehitin uuden tietotyypin flangiin: fobj. Joka on vain 350 riviä. Silti paremmat toiminnot. Ja 100x nopeampi.
Kirjoitin jopa prime_nth - funktion flangilla. Otin sen pois C - koodista rumentamasta. flangissa ei ole tällä hetkellä kuin ihan välttämättömimmät ja lisää ei tule.
flang/math.flang at master · mystikkogames/flang · GitHub

Sin - funktion renderöinti flangilla.
flang/examples.flang at master · mystikkogames/flang · GitHub
6o3GtsS.png
 
Oliko tässä tarkoitus tehdä suorituskykyisempi funktionaalinen kieli kuin mitä on tällä hetkellä tarjolla, vai mikä oli harjoituksen alkuperäinen motiivi?
 
Minä ainakin näen tästä, että mies osaa ohjelmoida, vaikka ei nähtävästi ole alan yliopistokoulutusta.

Kielihän on täysin turha (sori) ja funktionaalisia kieliä on riittävästi, mutta tässä osoitetaan, että ymmärretään ohjelmointikielen perusteita syvällisemmin ja motivaatiota ja kiinnostusta itsensä kehittämiseen löytyy.

Kannattaa hakea johonkin yliopistoon.

T: Ohjelmoinnin assari 2000-2005
 
flang 0.91 - on nyt ulkona!
8cxTmNg.jpg

flang ratkaisee nyt eulerit 1 -> 20
flang/euler_problems.flang at master · mystikkogames/flang · GitHub

Oliko tässä tarkoitus tehdä suorituskykyisempi funktionaalinen kieli kuin mitä on tällä hetkellä tarjolla, vai mikä oli harjoituksen alkuperäinen motiivi?
Motiivi oli se että tämä on itseasiassa 4:s kieleni. 3 ensimmäistä sisälsivät suunnitteluvirheitä. Mutta niistä virheistä opin kuinka kieli oikeasti implementoidaan.

Ei flang ole turha kieli. Se ratkaisee omin voimin 1 -> 20(+ euler#32) euleria. Sekä tuottaa kauniita fraktaaleja. Otin jopa :prime_nth funktion pois C - koodista ja kirjoitin sen flangilla. Hitaampi mutta ideana on näyttää että flang pystyy omin voimin ratkaisemaan oikeita ongelmia.
prime_nth() - kirjoitettuna flangilla
flang/utils.flang at master · mystikkogames/flang · GitHub

flangin tulostus on suoria kutsuja C:n (s/f)printf - funktioihin.
flang/unit_tests.flang at master · mystikkogames/flang · GitHub

flangin tiedostonkäsittely on suoria kutsuja C:n funktioihin.
flang/unit_tests.flang at master · mystikkogames/flang · GitHub

Vielä täytyy lisätä :asin/:acos/:log ...
Mutta omasta mielestä flang on jo nyt erittäin hyvä kieli. Tulokset puhuvat puolestaan.
 
Kerrotko vielä tosimaailman esimerkkejä joihin tätä tekemääsi voisi soveltaa?
 
Kyllähän flang on matemaattinen työkalu pääasiassa. Merkkijonon käsittely on myös erittäin tärkeä. Tosimaailman esimerkkinä flangin voi jättää ratkaisemaan matemaattista ongelmaa, kun itse työskentelee muissa hommissa. Ratkaisin flangilla eulerit 1 -> 20 ilman huijauksia. Jokainen voi tarkistaa githubista, että asia on näin. Tosin saatan tunkea prime_nth() takaisin C - koodiin.

flang vastaa myös äärimmäisen nopeasti komentoihin. Tämä koska flangin syntaksi on erittäin helppo( nopea ) parsia, mutta työläämpi kirjoittaa. flang on "single pass" kieli. Eli flang lukee sorsat tasan yhden kerran.

flang generoi kauniita satunnaisia julia set - fraktaaleja ilman mitään lisätyötä. Fraktaalin renderöinti kestää n. 5 - 10min.
flang/examples.flang at master · mystikkogames/flang · GitHub

Mutta flang on vasta 0.91. Työn alla on 0.92 versio. Kun 1.0 joskus valmistuu niin silloin se sisältää ne matemaattiset ja merkkijononkäsittely-funktiot, joilla ihan aikuisten oikeasti voi tehdäkin jotain hyödyllistä.
 
Kehitin uuden funktionaalisen kielen: flang.

Millä tavalla flang on funktionaalinen kieli? En tutustunut muuten kuin aloituspostauksen kautta, mutta tuo ei näytä oikein funktionaaliselta kieleltä vaan proseduraasiselta. Onko jotain esimerkkiä, jossa tuo todella toimii kuten funktionaaliset kielet?

Kun ajattelen funktionaalista ohjemointia, ajattelen Elmiä ja Haskellia.
 
En koodausta harrasta, joten en tiedä onko tälläselle kielelle käyttöä nykyisessä tai tulevissa muodoissa, mutta ei voi muuta sanoa kuin hattua nostaa. Kiva nähdä näitä harrasteprojekteja, joita kehitetään ja kehitetään.
 
Nimenomaan, toivoisi muilta enemmän kehitysideoita kuin lyttäystä.
 
Nimenomaan, toivoisi muilta enemmän kehitysideoita kuin lyttäystä.

Jos kurkkaat AP:n viestihistoriaa, niin kyseessä on joko trolli tai omahyväinen jääräpää, joka pitää itseään ja ohjelmointikieltään Einsteinista seuraavana, ja jolle edes vihjaus moderneista abstraktiotasoista tai vaikkapa garbage collectorista ovat itse saatanasta.
 
Millä tavalla flang on funktionaalinen kieli? En tutustunut muuten kuin aloituspostauksen kautta, mutta tuo ei näytä oikein funktionaaliselta kieleltä vaan proseduraasiselta. Onko jotain esimerkkiä, jossa tuo todella toimii kuten funktionaaliset kielet?

Kun ajattelen funktionaalista ohjemointia, ajattelen Elmiä ja Haskellia.
Jep, ei kauhean funktionaaliselta vaikuta kyllä minunkaan mielestäni, proseduraalikieleltä näyttää. Toki nykypäivänähän tuntuu trendi olevan se, että jos kieltä ei mainosteta funktionaaliseksi niin se vain ei kertakaikkiaan voi olla hyvä ;)
 
Niihän se menee että. Karavaani kulkee ja koirat räksyttää. En tiedä mitä siellä yliopiston/amk:n käsienheiluttelukursseilla oikein opetetaan funktionaalisista kielistä. Jotain turhaa C++:n moniperiytyvyyttä kai? Mutta flang todellakin on funktionaalinen kieli.

GC oli ajankohtainen. flangista loppui muisti kun työskentelin isojen julia settien parissa. Ratkaisin asian lisäämällä :free - kutsun. Se vapauttaa flangin oman fobj - tietotyypin. Eli []:n. Kehitin tämän tietotyypin, koska tarvitsin O(1)-ajan kutsuihin. Mitään GC:tä en viitsinyt edes alkaa kehittämään. Siitä olisi tullut ollut huono ja ideologisesti GC on aivan surkea.
 
Niihän se menee että. Karavaani kulkee ja koirat räksyttää. En tiedä mitä siellä yliopiston/amk:n käsienheiluttelukursseilla oikein opetetaan funktionaalisista kielistä. Jotain turhaa C++:n moniperiytyvyyttä kai? Mutta flang todellakin on funktionaalinen kieli.

Annatko yhden yksinkertaisen esimerkin, jossa flang toimii kuten funktionaaliset kielet. Pelkkä lihavoitu lause ei nyt ihan riitä...

Tai kerro vapaasti, mitä sinä ymmärrät käsitteellä 'funktionaalinen kieli'?
 
Hieno projekti ja mukava että tälläisiä jaksaa ihmiset harrastaa. Mutta mihin tätä yritys x sitten käyttäisi? Aika marginaalista hommaa varmasti ja en asiasta oikeen tiedä.
 
Hassu juttu, että tässä väännetään jostain termin määritelmästä. Joka on mainittu kerran README:ssä.

Mutta porukalta sopivasti unohtuu tämä suomalaisten ylpeys Linux. Jonka oikea termi on GNU/Linux. :D
GNU/Linux naming controversy - Wikipedia

Miksi tästä virheellisestä Linux - termistä ei pidetä mölinää yllä?
Linux and GNU - GNU Project - Free Software Foundation
There really is a Linux, and these people are using it, but it is just a part of the system they use. Linux is the kernel: the program in the system that allocates the machine's resources to the other programs that you run. The kernel is an essential part of an operating system, but useless by itself; it can only function in the context of a complete operating system. Linux is normally used in combination with the GNU operating system: the whole system is basically GNU with Linux added, or GNU/Linux. All the so-called “Linux” distributions are really distributions of GNU/Linux.
 
Mutta porukalta sopivasti unohtuu tämä suomalaisten ylpeys Linux. Jonka oikea termi on GNU/Linux. :D

Mites Android? Tai BusyBoxilla höystetty Linux? ":D"

Miksi tästä virheellisestä Linux - termistä ei pidetä mölinää yllä?

Varmaan siksi, että se ainut jätkä, jota tuo koko skenaario kiinnostaa on Richard Stallman, eli tämä mies, jonka harrastuksiin kuuluu jalkasilsan syöminen kesken haastattelun:

Eihän tämä liity millään tavalla ketjun aiheeseen. Vissiin halusit vaan päästä pätemään GNU-tietoudellasi?
 
Kyllä mä sanoisin, että jos joku postaa ohjelmointipalstalle ketjun, jossa käsitellään ohjelmointikieltä, jota väitetään funktionaaliseksi, on ihan relevanttia myös keskustella tästä väitteestä :think: Jos taas ei halua epämieluisaa keskustelua, ei ehkä kannata postailla keskustelufoorumeille.
 
Android on oikea termi. Androidista tosiaan on siivottu GNU matsku pois. Ja sen huomaa. Linux-kernel tosiaan on pienen pieni palanen GNU/Linux stäkkiä. GNU on käyttöjärjestelmä ja Linux-kernel sen kernel. Itseasiassa Linux-kernel on paaaaaljon vähäpätöisempi projekti kuin LLVM-stack. GNU/Linux on oikea termi, koska se antaa krediittiä GNU:n kehittäjille. Kyllähän GNU/Linuxilla on mukava kehittää flangia. Ilman GNUta ei olisi gcc:tä millä käännän flangin sorsat. flang itsessään on OS-riippumaton. GNU/Linux / Windows / MasOS kaikilla toimii.

Toinen asia on tämä virheellinen Linux-kernelin open source - status. Linux-kernelin "lähdekoodihan" sisältää valtavasti blobseja. Oma voodoo.js on 100% open sourcea. Linux-kernel ei ole.

Liittyyhän se tähän ketjun aiheeseen, koska joitakin kiinnostaa "funktionaalinen" - termi niin kovasti. Mutta silti virheellisesti puhellaan "linux":sta ja sen "open sourcesta" Tulenkin tästä lähin käyttämään oikeaoppista GNU/Linux - termiä kaikkialla.
 
Kyllä mä sanoisin, että jos joku postaa ohjelmointipalstalle ketjun, jossa käsitellään ohjelmointikieltä, jota väitetään funktionaaliseksi, on ihan relevanttia myös keskustella tästä väitteestä :think: Jos taas ei halua epämieluisaa keskustelua, ei ehkä kannata postailla keskustelufoorumeille.

Luin internetistä että C on funktionaalinen kieli. Koska kaikki internetissä on totta niin nimesin flanginkin samoin.
Sama asia kuin frameworkin ja libraryn ero. Voitko antaa täydellisen referaatin näiden erosta. Ei siis mölinää tyyliin. vue piste jii äs on vreimvörkki ja jkueri on liprary nääs.
Why is smalltalk not a functional programming language?
There's no accepted definition of functional programming language.
 
Luin internetistä että C on funktionaalinen kieli. Koska kaikki internetissä on totta niin nimesin flanginkin samoin.

Ok, tuo vaikuttaa tähän mennessä parhaimmalta selitykseltä. Toisella palstalla oli myös ihan hyvä - tosin täysin eri - selitys :)

Sama asia kuin frameworkin ja libraryn ero. Voitko antaa täydellisen referaatin näiden erosta. Ei siis mölinää tyyliin. vue piste jii äs on vreimvörkki ja jkueri on liprary nääs.
Why is smalltalk not a functional programming language?
There's no accepted definition of functional programming language.

Olet kerrankin asian ytimessä. Ei pornollekaan ole tarkkaa määritelmää, mutta silti kaikki leffat eivät ole pornoa. Toisaalta on kieliä, joilla voidaan ohjelmoida useiden paradigmojen tavoin. Tässä hiukan jaottelua:

Comparison of programming paradigms - Wikipedia

Ja juuri tästä syystä kysyin sinulta aiemmin esimerkkejä, joissa flangia käytetään funktionaalisen ohjelmointikielen tavoin. Niitä ei tullut. Aiemmin kerroit, että funktiot ovat flangissa "first class citizens". Taisit ottaa tuon väitteen jossain välissä pois? Olisin siis halunnut kuulla, että mitä funktionaalista SINUN mielestäsi flangissa on kun esimerkkien valossa se näytti proseduraaliselta kieleltä. Mutta vedit herneen syvälle nenään, joten eipä tässä saatu asiallista keskustelua aiheesta.

Itse odotan näkeväni funktionaalisessa kielessä jotain näistä: funktioilla ei sivuvaikutuksia => kaikki toteutetaan funktioiden palauttamien arvojen avulla, muuttumattomat (immutable) muuttujat, ei lokaalia (/globaalia) tilaa, currying jne. Kun kieli pakottaa noihin, päästään eroon isosta joukosta virheitä.

Itselläni on isompaa kokemusta vain Elmistä, mutta esim. Haskelliin olisi kiinnostava tutustua. Elm aiheuttaa monta kertaa tämän tunteen: "aa, se kääntyi, se siis toimii." Juuri yllä lueteltujen piirteiden takia.

Sama pätee fameworkiin. Ei ole mitään tarkkaa määritelmää. Mutta täällä aika hyvin avataan termien eroja (tosin en ole lainkaan sitä mieltä, että frameworkit olisivat aina huono asia):

Library patterns: Why frameworks are evil

Koska tuo kysymys taisi liittyä voodoo.js:ään, niin omaan silmääni se näyttää pieneltä kirjastolta. (aa, siinäkin näköjään kutsuit sitä aluksi frameworkiksi, et enää). Django on aika selvästi Framework. Moment.js on aika selvästi kirjasto. Mutta joskus ollaan harmaalla alueella löytyy piirteitä vähän kummastakin.
 
Nyt tiedän funktionaalisen termin. Tästä olikin suuri hyöty jatkoa ajatellen. SN-ratio lähenee kyllä 0:aa. Mutta kyllä se minulle sopii, että luomastani kielestä keskustellaan vaikka 100000 viestin verran. Sen verran vaivaa näin sen eteen. flangin binääri vaatii tosin GNU/Linuxin, koska sorsat on käännetty GNU/Linuxilla. Täytynee lisätä README:n seuraavaksi tuo GNU/Linuxin vaatimus kun pääsi unohtumaan. Eipä tässä mitään julkaistavaa ole flangin suhteen. Mutta kiva että flang - kieli kiinnostaa niin monia. Se on mukava nähdä. Täytynee jossain kohtaa keskittyä regex - modulin. Vai regex - paketin? Vai regex - koodin? ( 100% oikea akateeminen termi hukassa... ) parantamiseen
 
Täytynee lisätä README:n seuraavaksi tuo GNU/Linuxin vaatimus kun pääsi unohtumaan.
Niin, yleensä readmen tarkoitus on kuvata miten softa ajetaan/käänetään/setupataan jne. Se tuolta puuttuu nyt kokonaan. No, näyttihän tuo ainakin 64bit Ubuntussa pyörivän.

Mikset sitä tulkin sorsaa halua julkaista? Olisi varmaan vähimmäisvaatimus sille, että tämä kieli ketään muuta kiinnostaisi pätkääkään.
 
flang kyllä kertoo miten se toimii. Kun sen ajaa. Mutta euler_problems.flang/unit_tests.flang/examples.flang toimii ongelmattomasti.

Miksikö en julkaise sorsaa? Tästä syystä: Eräs projekti joka meni kiinni kontributioiden puutteen takia: Archiving the project: suspending the development · Issue #15344 · ariya/phantomjs · GitHub
Kaikki pöllisivät ideani, jotka itsellä on kiinni flangissa. Mutta kontribuutioita ei varmasti kuuluisi takaisin. Mitä nyt mitättömät turhakkeet kyseenalastaisivat suuren mestarin ohjelmointiarkkitektuurisia ratkaisuja. Nämä samat turhakkeet jotka eivät ole edes saaneet aikaan pong-peliä. Niinkuin tähänkin asti. Tietysti jos kontribuutioita tulisi niiden taso olisi huono ja pian flang olisi bloatti paskakasa kuten Linux/Cryengine/Unity/... Haluan pitää flangin mahdollisimman kompaktina.

Koko flangin idea on postfixissä. Itse ainakaan en huomannut postfixin olevan vaikea koodata. Päinvastoin. flangin oma tietotyyppi on O(1). Implementoin aluksi JSON. Mutta se ei ollut O(1). Turing complete - kieli tarkoittaa että O(1) - kutsut pitävät olla mahdollisia. Ja esim JavaScriptissä näin ei ole.

C++ ylitti kriittisen kompleksisuuden (unique_ptr jne.) n. 5v sitten. JavaScript on samalla uralla. Teen flangista niin hyvän, simppelin, kompaktin ja nopean kielen. Että sitä ei voi vastustaa!
 
Vaan olisipa hyvä jos muiden kielien kehittäjät voisivat opetella flangin sorsaa lukemalla kuinka ohjelmointikieli tulee oikeasti rakentaa.
 
Täysin samaa mieltä. Mutta taikuri joka paljastaa temppujensa salaisuudet ei ole taikuri enää. Vaan pelkkä onneton esiintyjä/toteuttaja.
 
flang kyllä kertoo miten se toimii. Kun sen ajaa. Mutta euler_problems.flang/unit_tests.flang/examples.flang toimii ongelmattomasti.

Miksikö en julkaise sorsaa? Tästä syystä: Eräs projekti joka meni kiinni kontributioiden puutteen takia: Archiving the project: suspending the development · Issue #15344 · ariya/phantomjs · GitHub
Kaikki pöllisivät ideani, jotka itsellä on kiinni flangissa. Mutta kontribuutioita ei varmasti kuuluisi takaisin. Mitä nyt mitättömät turhakkeet kyseenalastaisivat suuren mestarin ohjelmointiarkkitektuurisia ratkaisuja. Nämä samat turhakkeet jotka eivät ole edes saaneet aikaan pong-peliä. Niinkuin tähänkin asti. Tietysti jos kontribuutioita tulisi niiden taso olisi huono ja pian flang olisi bloatti paskakasa kuten Linux/Cryengine/Unity/... Haluan pitää flangin mahdollisimman kompaktina.

Koko flangin idea on postfixissä. Itse ainakaan en huomannut postfixin olevan vaikea koodata. Päinvastoin. flangin oma tietotyyppi on O(1). Implementoin aluksi JSON. Mutta se ei ollut O(1). Turing complete - kieli tarkoittaa että O(1) - kutsut pitävät olla mahdollisia. Ja esim JavaScriptissä näin ei ole.

C++ ylitti kriittisen kompleksisuuden (unique_ptr jne.) n. 5v sitten. JavaScript on samalla uralla. Teen flangista niin hyvän, simppelin, kompaktin ja nopean kielen. Että sitä ei voi vastustaa!

Kuulostaa aika huvittavalta, että et halua julkaista lähdekoodia sen takia, ettei "ideoitasi" varasteta ja pelkäät kritiikkiä. Kuitenkin sitten aloitusviestissä kerroit, että ihan pelkkää harrastelua on, eikä mitään kaupallisia tavoitteita. Eikö tuossa tapauksessa olisi parempi ihan omana tietonaan pitää koko projekti, vai etkö saa toteutettua itseäsi ilman täällä kerskailua, kuinka hieno onkaan mestariteoksesi? No tännehän voi purkaa ylpeyttään, jos ei muuta kohdetta löydy. Onnea vaan joka tapauksessa kielesi kanssa.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
261 839
Viestejä
4 548 782
Jäsenet
74 851
Uusin jäsen
hieunguyen

Hinta.fi

Back
Ylös Bottom