3. harjoitustehtävä

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))
Lauri Alanko