Paula Kuosmanen 20.5.2009: Useimpiin vastauksiin on kirjoitettu kyseisen vastauksen arvosteluperusteet. Vastauspaperit ovat Juha Vihavaisella. Jos haluatte keskustella arvostelusta, pyytäkää ensin häneltä paperi nähtäväksenne ja sitten vasta ottakaa minuun yhteyttä arvostelukommenttien ja lyhyen selityksen vastauksen sisällöstä kera. (Tai ottakaa kopio ja sopikaa tapaamisesta.) ------------------------------------------------------------------------------ 2. Consider the following Scala program: var x = 31 // global variables var y = 91 def add {x = x + y} def second(P: => Unit) {var x = 47; P} def first {var y = 71; second(add)} // Main: first println(x) a. What does this program print, when Scala uses static scoping? Explain how you get the result. b. What would it print if the language used dynamic scoping? Explain how you get the result. Pisteet jakautuivat tasan a- ja b-kohdan kesken, eli 5 pistettä enintään kummastakin. B-kohdasta oli mahdollista saada papukaijamerkki (PKM), joka korvaa yhden menetetyn pisteen tehtävässä 2 tai 3 (tehtävillä 1 ja 4 eri tarkastaja, joten ei ulotu niihin). Papukaijamerkistä (ja missä se mahdollisesti korvaa jotain) on merkintä vastauspaperissa. Pelkistä tulosteista ei saanut pisteitä. Hyvä selitys oli keskeisessä asemassa. Puhtaista laskuvirheistä ei vähennetty pisteitä, jos oli muuten selvää, mitä lasketaan yhteen. Perusperiaatteena: "Voidaanko tästä vastauksesta päätellä opiskelijan ymmärtäneen asian?" a) Täydet 5 pistettä sai kertomalla mitkä x ja y lasketaan yhteen, mitä tulostetaan ja erityisesti miksi (leksikaalinen koodin rakenne / lohkorakenne / tms.). Jos perustelut puuttuivat, mutta selvästi oli rivien välistä luettavissa, että asia on ymmärretty, annettiin keskimäärin 3-4 pistettä. b) Samat perusperiaatteet kuin a-kohdassa. Tässä kohdassa suoritusjärjestyksen selittäminen oli suotavaa, koska suoritusjärjestys ratkaisee sidonnat. Kertomalla kummasta tahansa sidontavasta (syvä vs. matala) oli mahdollista saada täydet pisteet. Kertomalla molemmista virheettömästi sai vielä papukaijamerkinkin, hieman virheellisestä selityksestäkin plussaa (esim. jos molemmissa vain vähän virheitä, mahdollista saada 5 pistettä). Sidontatapoja ei tarvinnut muistaa nimeltä, joten myöskään niiden muistamista väärin päin ei laskettu virheeksi. Selkeistä logiikkavirheistä vähennettiin tietysti pisteitä. Esimerkiksi yleinen virhe oli sidontojen elinajoissa sekaisin meneminen (joko tuhoutuminen jäi huomaamatta tai tuhottiin liian aikaisin). Huolimattomuusvirheitä sai helpommin anteeksi (esim. luki globaalien muuttujien x ja y arvot ristiin). 3. Answer the following questions concerning programming languages: a. Describe four common parameter-passing modes. Give enlightening program examples and explain them thoroughly. Max 6 pistettä. Parametrinvälitystavoilla ei ole virallista yleisyyslistaa, joten mikä tahansa neljän kombinaatio kelpaa - Call by value - Call by reference - Call by value/result - Call by name - Call by sharing - muu, jonka pystyin Googlen avulla todentamaan Vastauksissa oli tärkeää, että ne olivat selkeitä ja havainnollisia. Epämääräisyys tai monitulkintaisuus oli pahasta. Yksikäsitteistä pisteytystä ei ollut, mutta alla suuntaviivoja. - Arvo- ja viitevälitys olivat yleisimmät, joten niiden selityksistä sai yhden pisteen kummastakin. - Nimiparametrista sai kaksi, jos kertoi sulkeumasta / suorituksesta kutsukohdan ympäristössä; yhden jos puhui vain makromaisesta tekstikorvauksesta - Muista välitystavoista sai myös yhden pisteen. Jos nimiparametria ei mainittu lainkaan (muu kombinaatio), pisteet jaettiin tasan. - Tunnistettavasta kuvailusta oli mahdollista saada pisteitä, vaikka ei välitystavan nimeä olisi muistanutkaan. - Plussaa tai miinusta esimerkeistä. Esimerkit piti myös selittää (vähintään mitä arvoja otetaan mistäkin, sijoitetaan mihinkin, tulostetaan, jne.). - Virheistä, puutteista ja erittäin epäselvästä selityksestä tietysti miinusta. Jos ei ollut esimerkkejä lainkaan, maksimipistemäärä oli 3. Samoin jos oli mainittu vain kaksi tapaa ja niiden esimerkit. Jos kertoi nimiparametrista, mutta vain "makrona", maksimipistemäärä oli 5 riippumatta siitä, miten hyvä muu vastaus oli. Esimerkkinä harjoitustehtävän 22 tyylinen koodi oli oikein hyvä, samoin swap-funktio. Huono esimerkki oli sellainen, jossa oli vain jotain koodia ja sanallinen toisto aikaisemmasta selityksestä. Muodollisen ja todellisen parametrin nimenä ei saanut käyttää samaa kirjainta - sellaisesta ei saa mitään selvää kommenttienkaan kera (esim. "tässä i:n arvo muuttuu..." - kumman i:n?). b. What is a higher-order function (also known as a functional form)? Give enlightening program examples and explain them thoroughly. Max 4 pistettä. - Funktio joka * ottaa parametrinaan funktion 1 p * palauttaa arvonaan funktion 1 p - valaiseva esimerkki 1-2 p - plussaa, jos kertoi käyttötarkoituksista (sulkeuma, curry-muunnos, funktionaalisen ohjelmoinnin kulmakivi, tms.) Hyvänä esimerkkinä kelpasi vaikkapa edellisen tehtävän asiaan liittyvä koodi. Vähemmän havainnollinen (hankalasti hahmotettava) esimerkki oli vaikkapa def f (g: => Unit, x: Int) { g(x) } Tässä tehtävässä oli vaikeaa antaa esimerkkiä, joka antaisi lisäarvoa selitykselle, joten esimerkistä sai verrattain helposti täydet pisteet.