Kirjoittaja: map_ (03.12.2009)
Scheme on vuonna 1975 alkunsa saanut moderni murre vuonna 1958 kehitetystä Lisp-kielestä. Kieli tukee mm. funktionaalista, proseduraalista ja oliopohjaista ohjelmointia. Funktionaalinen tyyli on näistä kuitenkin luonnollisin ja luultavasti suosituin.
Vaikka Schemeen on vuosien varrella kertynyt joitakin lisäominaisuuksia, kielen perusteet ovat edelleen äärimmäisen helppoja ymmärtää. Scheme on yksi harvoista kielistä, josta voi oppia melkein kaiken oleellisen alle tunnissa. Opittavia asioita on vain vähän, mutta hyvin vähällä koodilla voi tehdä hyvin paljon.
Schemen kehittäjät ovat yhdysvaltalaisen MIT-yliopiston tutkijoita, ja Scheme oli siellä pitkään ensimmäinen opetettava ohjelmointikieli. Scheme ansioituu yhä ohjelmointitekniikoiden ja ohjelmointikielten periaatteiden opetuskielenä sen äärimmäisen yksinkertaisuuden ja joustavuuden takia.
Schemessä melkein kaikki asiat tehdään kutsumalla funktioita. Funktiokutsu on muotoa (f 1 2 3)
, missä f on funktio ja 1, 2 ja 3 ovat parametreja. Schemessä jopa yhteenlasku on funktio siinä missä muutkin funktiot. Yhteenlaskufunktion nimi sattuu olemaan "+
". Näin ollen esimerkiksi 1
ja 2
lasketaan yhteen kirjoittamalla (+ 1 2)
. Samalla periaatteella voidaan kirjoittaa monimutkaisempiakin lausekkeita, kuten (* 2 (+ 5 7))
.
Funktioita määritellään kirjoittamalla (lambda (parametri1 parametri2 jne) lauseke)
. Esimerkiksi funktio, joka kasvattaa annettua lukua kahdella kirjoitetaan (lambda (x) (+ x 2))
. Näin ollen ((lambda (x) (+ x 2)) 10)
antaa 12.
Asioille annetaan nimiä kirjoittamalla (define nimi asia)
. Esim. (define joulukuu 12)
määrittelee muuttujan joulukuu
arvoksi 12
. Funktioille annetaan nimiä samalla tavalla: (define pluskaksi (lambda (x) (+ x 2)))
. Nyt voidaan kirjoittaa (pluskaksi joulukuu)
, ja saadaan tulokseksi 14
.
Tekstiä tulostetaan display-funktiolla:
(display "Hauskaa joulua!")
Tulostus:
Hauskaa joulua!
Seuraava ohjelma tulostaa Fibonaccin lukuja:
(define fibo ; Määritellään fibo seuraavasti: (lambda (a b) ; se on kaksi parametria ottava funktio, joka toimii näin: (if (< a 100) ; Jos a < 100... (cons a ; Palautetaan lista, jonka 1. alkio on a ja (fibo b (+ a b))) ; jonka loppuosa saadaan rekursiivisesti. '()))) ; Muuten (a >= 100) palautetaan tyhjä lista. (display (fibo 0 1))
Tulostus:
(0 1 1 2 3 5 8 13 21 34 55 89)
; Kutsutaan funktiota + arvoilla 1 ja 2, ja annetaan paluuarvo display-funktiolle. (display (+ 1 2)) ; Tulostaa 3 (newline) ; Tulostaa rivinvaihdon ; Määritellään muuttuja "viisi". (define viisi (+ 2 3)) (display viisi) ; Tulostaa 5 (newline) ; Määritellään funktio tuplaa(x) = 2*x (define tuplaa (lambda (x) (* 2 x))) (display (tuplaa 3)) ; Tulostaa 6 (newline) ; Määritellään funktio tee-kahdesti(f), joka palauttaa uuden funktion ; g(x) = f(f(x)). (define tee-kahdesti (lambda (f) (lambda (x) (f (f x))))) ; Olemme nyt määritelleet kolme muuttujaa: viisi, tuplaa ja tee-kahdesti. ; Muuttujan viisi arvo on eräs luku, 5. ; Muuttujan tuplaa arvo on eräs funktio, joka käsittelee lukuja. ; Muuttujan tee-kahdesti arvo on eräs funktio, joka käsittelee funktioita. ; Jos annetaan tee-kahdesti-funktiolle tuplaa-funktio, saadaan funktio, ; joka nelinkertaistaa lukuja. (define nelinkertaista (tee-kahdesti tuplaa)) ; Tätä uutta funktiota voidaan kutsua ihan normaalisti. (display (nelinkertaista 3)) ; Tulostaa 12 (newline) ; Nelinkertaistamistakin voidaan tehdä kahdesti. (display ((tee-kahdesti nelinkertaista) 3)) ; Tulostaa 48 (newline)