Yleisimmät virheet olivat, että pick ei käsitellyt
tilannetta, jossa annetun sanaluokan sanaa ei löydy, ja
nelostehtävän end ei palauttanut luotua
listaa, vaan tulosti sen.
Suurin osa nelostehtävän toteutuksista oli tehty erittäin
hitaasti lisäämällä uusi elementti aina edellisen loppuun.
Näistä ei kuitenkaan rankaistu. Muutkin eksoottiset ratkaisut
hyväksyttiin kunhan tehtävänanto vain täyttyi. Poikkeuksena
eval:in käyttö: sitä ei ole luennoilla käsitelty,
joten sen käyttö osoittaa, että tekijä luulee tietävänsä
paremman tavan asioiden tekemiseen. Noh, tiedoksi:
eval on Väärä Tapa ratkaista tehtävä. Sen käytöstä
rokotetaan piste.
;; Sormiharjoitukset
;; 1.
(define (got . args)
(length args))
;; 2.
(define (oneof l)
(list-ref l (random (length l))))
;; Itse tehtävä
(load "sxj2003.scm")
;; 1.
(define (pick spec)
(let ((entry (assoc spec dict)))
(if entry
(oneof (cdr entry))
spec)))
;; 2.
(define (choose . args)
(oneof args))
;; 3.
(define (state spec . follow)
(lambda ()
(display (pick spec))
(display " ")
((oneof follow))))
(define (state0 . follow)
(lambda ()
((oneof follow))))
(define (end) (newline))
(define full-stop (state0 end))
(define ade (state '(n sg ade advl) full-stop))
(define <gen (state '(n sg ess <gen) full-stop))
(define gen (state '(n sg gen n>) <gen))
(define ptv (state '(n sg ptv <p) full-stop))
(define ptv> (state '(p ptv>) ptv))
(define advl (state0 ptv> gen ade full-stop))
(define ins (state '(n pl ade ins) advl))
(define ins0 (state0 ins advl))
(define mat (state '(n pl ela mat) advl))
(define mat0 (state0 advl))
(define pass/ins (state '(v pass /ins) ins0))
(define pass/mat (state '(v pass /mat) mat0))
(define pat (state '(n sg nom pat) pass/mat pass/ins))
(define pat> (state '(a sg nom pat>) pat))
(define obj/ins (state '(n sg gen obj) ins0))
(define obj/ins> (state '(a sg gen obj>) obj/ins))
(define act/ins (state '(v pl 3 /ins) obj/ins> obj/ins))
(define obj/mat (state '(n sg gen obj) mat0))
(define obj/mat> (state '(a sg gen obj>) obj/mat))
(define act/mat (state '(v pl 3 /mat) obj/mat> obj/mat))
(define ag (state '(n pl nom ag) act/mat act/ins))
(define ag> (state '(a pl nom ag>) ag))
(define s (state0 ag> ag pat> pat))
;; 4. Kuten edellinen, paitsi että:
(define (state spec . follow)
(lambda (acc)
((oneof follow) (cons (pick spec) acc))))
(define (state0 . follow)
(lambda (acc)
((oneof follow) acc)))
(define (end acc)
(reverse acc))