Clojure

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 17. maaliskuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 6 muokkausta .
Clojure
Kieliluokka toimiva , moniparadigma
Esiintyi 2007
Tekijä Rikas Hickey
Kehittäjä Hickey, Richard
Tiedostotunniste _ .clj, .cljs, .cljc, .edntai.cljr
Vapauta 1.11.1 ( 5. huhtikuuta 2022 )
Tyyppijärjestelmä dynaaminen, tiukka
Vaikutettu Lisp , ML , Haskell , Erlang [1] , Prolog , Scheme , Java , Ruby [2]
vaikutti Eliksiiri
Lisenssi Eclipse julkinen lisenssi
Verkkosivusto clojure.org
 Mediatiedostot Wikimedia Commonsissa

Clojure (lausutaan sulkeminen [ˈklōZHər]) on Lispin moderni murre , yleiskäyttöinen ohjelmointikieli , joka tukee vuorovaikutteista kehitystä, joka kannustaa toiminnalliseen ohjelmointiin ja helpottaa monisäikeistystä . Clojure toimii JVM- ja CLR -alustoilla . Clojure erottuu filosofiasta "koodi datana" ( homoicon ) ja kehitetty Lisp-makrojärjestelmä .

Clojure - kääntäjä jaetaan vapaasti Eclipse Public License -lisenssin ehtojen mukaisesti .

Filosofia

Rich Hickey suunnitteli Clojuren nykyaikaiseksi Lisp -ohjelmistoksi toiminnalliseen ohjelmointiin integroituna Java - alustaan, joka on suunniteltu tukemaan samanaikaisuutta . [3]

Syntaksi

Kuten minkä tahansa muun Lispin, Clojuren syntaksi perustuu S-lausekkeisiin , jotka jäsentäjä kääntää tietorakenteiksi ennen kääntämistä . Clojuren jäsentäjä tukee tavallisten luetteloiden lisäksi kirjaimellista syntaksia assosiatiivisille taulukoille , joukoille ja vektoreille välittäen kaikki nämä tietorakenteet kääntäjälle . Toisin sanoen Clojure-kääntäjä ei vain kokoa luettelotietorakenteita, vaan tukee suoraan kaikkia määritettyjä tyyppejä.

Vaikka Clojure on Lispin alkuperäisen version laajennus , se ei ole yhteensopiva Lispin kanssa, toisin sanoen Lispin nykyaikaisten versioiden ohjelman kanssa (lukuun ottamatta mahdollisesti lyhintä, alkeellisinta ja lisäksi erityisesti valittua esimerkit) tai ei ollenkaan Clojure-kääntäjä läpäisee tai se ei toimi oikein. Erot yleisistä Lisp-versioista on lueteltu kielisivustolla [4] . Tässä on joitain niistä:

Makrot

Clojure-makrojärjestelmä on hyvin samanlainen kuin sen Common Lisp -makrojärjestelmä kahdella poikkeuksella:

Kielen ominaisuudet

Esimerkkejä

hei maailma :

( tulosta "Hei maailma!" )

Säie -turvallinen yksilöllinen sarjanumerogeneraattori:

( anna [i ( atom 0 ) ] ( defn generate-unique-id "Palauttaa eri numeerisen tunnuksen jokaiselle puhelulle." [] ( swap! i inc )))

Anonyymi alaluokka java.io.Writer, joka ei tulosta mitään, ja makro, jota käytetään hiljentämään kaikki sen sisältämät lähdöt:

( def bit-bucket-writer ( välityspalvelin [java.io.Writer] [] ( kirjoittaa [buf] nolla ) ( sulje [] nolla ) ( huuhtele [] nolla ))) ( defmacro noprint "Arvioi annetut lausekkeet mykistämällä kaikki *ulostulot* näytölle." . [& lomakkeet] ` ( sitova [*out* bit-bucket-writer] ~@forms )) ( noprint ( println "Hei, ei kukaan!" ))

10 säiettä, jotka käsittelevät yhtä yhteistä tietorakennetta, joka koostuu 100 vektorista, joista jokainen sisältää 10 (alun perin peräkkäistä) yksilöllistä numeroa. Jokainen lanka valitsee toistuvasti kaksi satunnaista paikkaa kahdessa satunnaisvektorissa ja vaihtaa niiden arvoja. Kaikki vektorin muutokset tapahtuvat yhdessä tapahtumassa käyttämällä Clojure- tapahtumamuistijärjestelmää . Siksi edes 1000 iteroinnin jälkeen ei menetetä yhtään numeroa kussakin säikeessä.

( defn run [nvecs nitems nthreads niters] ( anna [vec- refs ( vec ( map ( comp ref vec ) ( osio nitems ( alue ( * nvecs nitems ))))) swap #( anna [v1 ( rand-int nvecs ) v2 ( rand-int nvecs ) i1 ( rand-int nitems ) i2 ( rand-int nitems ) ] ( dosync ( anna [temp ( nth @ ( vec- refs v1 ) i1 ) ] ( alter ( vec-refs v1 ) assoc i1 ( nth @ ( vec-refs v2 ) i2 )) ( alter ( vec-refs v2 ) assoc i2 temp )))) raportti #( do ( prn ( map deref vec- refs )) ( println "Erillinen:" ( count ( different ( käytä concat ( map deref vec- refs )))))) ] ( report ) ( dorun ( käytä pcalls ( toista n säiettä #( dotimes [_ niters] ( swap ))))) ( raportti ))) ( ajaa 100 10 10 100 000 )

Edellisen esimerkin tulos:

( [0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ... [990 991 992 993 994 995 996 997 998 999 :) 100tinct ] ( [ 382 318 466 963 619 22 21 273 45 596] [ 808 639 804 471 394 904 952 75 289 778 ] ... [ 484 216 622 139 75 20 20 20 28 28 139 139

Katso myös

Muistiinpanot

  1. Rikas Hickey. Clojureen vaikuttaneet kirjat (linkki ei saatavilla) (30. kesäkuuta 2009). Haettu 11. syyskuuta 2009. Arkistoitu alkuperäisestä 18. huhtikuuta 2012. 
  2. Clojure-ohjelmointi . Haettu 30. huhtikuuta 2013. Arkistoitu alkuperäisestä 21. toukokuuta 2015.
  3. Perustelut (downlink) . Rikas Hickey . clojure.org. Haettu 17. lokakuuta 2008. Arkistoitu alkuperäisestä 18. huhtikuuta 2012. 
  4. Erot Clojuren ja Lispin välillä . Haettu 23. lokakuuta 2017. Arkistoitu alkuperäisestä 8. heinäkuuta 2019.

Kirjallisuus

Linkit

Venäjäksi