24
P ROGRAMMEERIMISKEELED Imperatiivsed konstruktsioonid Seni vaadeldud Scheme alamhulk on puhtalt funktsionaalne; so. programmi täitmise ainsaks tulemuseks on tema väärtus Enamik keeli on imperatiivsed, kus programmi täidetakse mitte konkreetse väärtuse leidmiseks, vaid mingi kõrvalefekti tekitamiseks sisend/väljund omistamine, “muteeritavad” muutujad efektide järjekorras täitmine VARMO V ENE 1

varmo vene

  • Upload
    dotuyen

  • View
    257

  • Download
    2

Embed Size (px)

Citation preview

Page 1: varmo vene

PROGRAMMEERIMISKEELED

Imperatiivsed konstruktsioonid

• Seni vaadeldud Scheme alamhulk on puhtalt

funktsionaalne; so. programmi täitmise ainsaks

tulemuseks on tema väärtus

• Enamik keeli onimperatiivsed, kus programmi

täidetakse mitte konkreetse väärtuse leidmiseks, vaid

mingi kõrvalefektitekitamiseks

– sisend/väljund

– omistamine, “muteeritavad” muutujad

– efektide järjekorras täitmine

VARMO VENE 1

Page 2: varmo vene

PROGRAMMEERIMISKEELED

Efektide järjekorras täitmine

• Begin-avaldiste süntaks:

〈expr〉 ::= . . .

| (begin〈expr〉 . . .〈expr〉)

• Avaldises(begin E1 . . .En)

– väärtustatakse avaldisedE1 . . .En üksteise järel

vasakult paremale

– viimasena väärtustatava avaldiseEn väärtus on kogu

avaldise väärtuseks

VARMO VENE 2

Page 3: varmo vene

PROGRAMMEERIMISKEELED

Efektide järjekorras täitmine

> (begin

(display "Here is my answer: ")

(display (+ 2 4 (* 4 5))))

Here is my answer: 26

> (begin

(display "Here is my answer: ")

(newline)

(display (+ 2 4 (* 4 5))))

Here is my answer:

26

VARMO VENE 3

Page 4: varmo vene

PROGRAMMEERIMISKEELED

Efektide järjekorras täitmine

(define for-each

(lambda (proc lst)

(if (null? lst)

’done

(begin

(proc (car lst))

(for-each proc (cdr lst))))))

VARMO VENE 4

Page 5: varmo vene

PROGRAMMEERIMISKEELED

Efektide järjekorras täitmine

(define displayln

(lambda lst

(begin

(for-each display lst)

(newline))))

> (displayln "The answer is: " (+ 3 4 5))

The answer is: 12

VARMO VENE 5

Page 6: varmo vene

PROGRAMMEERIMISKEELED

Efektide järjekorras täitmine

• Avaldiste järjekorrad võivad esineda mõnedes teistes

keelekonstruktsioonides (s.h.lambda, let, letrec

kehad ningcond, case, variant-case alternatiivid)

• Selliseid avaldiste järjekordi käsitletakse begin-avaldise

süntaktilise suhkruna

(define displayln

(lambda lst

(for-each display lst)

(newline)))

VARMO VENE 6

Page 7: varmo vene

PROGRAMMEERIMISKEELED

Sisend/väljund operatsioone

• write trükib objekti esituse

• read-char loeb konsoolilt ühe sümboli

• read loeb terve objekti

(define read-eval-print

(lambda ()

(display "-->")

(write (eval (read)))

(newline)

(read-eval-print)))

VARMO VENE 7

Page 8: varmo vene

PROGRAMMEERIMISKEELED

Sisend/väljund operatsioone

> (read-eval-print)

-->3

3

-->(+ 1 2 3)

6

-->"Hello"

"Hello"

-->(car 3)

car: expects argument of type <pair>; given 3

>

VARMO VENE 8

Page 9: varmo vene

PROGRAMMEERIMISKEELED

Andmestruktuuride “muteerimine”

> (define lst (list 1 2))

> (set-car! lst 3)

> lst

(3 2)

> (set-cdr! lst (list 4 5))

> lst

(3 4 5)

> (set-car! (cdr lst) 6)

> lst

(3 6 5)

VARMO VENE 9

Page 10: varmo vene

PROGRAMMEERIMISKEELED

Andmestruktuuride “muteerimine”

> (define p (cons 1 ’()))

> (begin (set-cdr! p p) ’done)

done

> (car p)

1

> (cadr p)

1

> (caddr p)

1

> p

#0=(1 . #0#)

VARMO VENE 10

Page 11: varmo vene

PROGRAMMEERIMISKEELED

Andmestruktuuride “muteerimine”

(define reverse!

(letrec ((loop

(lambda (last ls)

(let ((next (cdr ls)))

(set-cdr! ls last)

(if (null? next)

ls

(loop ls next))))))

(lambda (ls)

(if (null? ls) ls (loop ’() ls)))))

VARMO VENE 11

Page 12: varmo vene

PROGRAMMEERIMISKEELED

Andmestruktuuride “muteerimine”

> (define c (cons 3 ’()))

> (define b (cons 2 c))

> (define a (cons 1 b))

> (reverse! a)

(3 2 1)

> a

(1)

> b

(2 1)

> c

(3 2 1)

VARMO VENE 12

Page 13: varmo vene

PROGRAMMEERIMISKEELED

Omistamine

• set! spetsiaalvorm

〈expr〉 ::= . . .

| (set!〈variable〉 〈expr〉)

• Avaldis (set! x exp) omitsabmuutujalex avaldiseexp

väärtuse

• Muutujax tähistabaadressit(ja mitte muutuja väärtust)

• Selleks et muutujale omistada, peab muutuja olema enne

defineeritud

VARMO VENE 13

Page 14: varmo vene

PROGRAMMEERIMISKEELED

Omistamine

> (define x 1)

> (set! x 2)

> x

2

> (set! x (+ x 2))

> x

4

> (let ((y 3))

(set! y 4)

(+ y 1))

5

VARMO VENE 14

Page 15: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 1)

(define empty? ’*)

(define push! ’*)

(define pop! ’*)

(define top ’*)

(let ((stk ’()))

(set! empty?

(lambda () (null? stk)))

(set! push!

(lambda (x) (set! stk (cons x stk))))

...

VARMO VENE 15

Page 16: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 1)

...

(set! pop!

(lambda ()

(if (empty?)

(error "Stack empty")

(set! stk (cdr stk)))))

(set! top

(lambda ()

(if (empty?)

(error "Stack empty")

(car stk)))))

VARMO VENE 16

Page 17: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 1)

> (push! 1)

> (push! 2)

> (top)

2

> (pop!)

> (top)

1

> (pop!)

> (empty?)

#t

VARMO VENE 17

Page 18: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 2)

(define stack

(let ((stk ’()))

(lambda (message)

(case message

((empty?) (lambda ()

(null? stk)))

((push!) (lambda (x)

(set! stk (cons x stk))))

...

VARMO VENE 18

Page 19: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 2)

...

((pop!) (lambda ()

(if (null? stk)

(error "Stack empty")

(set! stk (cdr stk)))))

((top) (lambda ()

(if (null? stk)

(error "Stack empty")

(car stk))))

(else (error "stack: Invalid message" message))))))

VARMO VENE 19

Page 20: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 2)

> ((stack ’push!) 1)

> ((stack ’push!) 2)

> ((stack ’top))

2

> ((stack ’pop!))

> ((stack ’top))

1

> ((stack ’pop!))

> ((stack ’empty?))

#t

VARMO VENE 20

Page 21: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 3)

(define make-stack

(lambda ()

(let ((stk ’()))

(lambda (message)

(case message

((empty?) (lambda ()

(null? stk)))

((push!) (lambda (x)

(set! stk (cons x stk))))

...

VARMO VENE 21

Page 22: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 3)

...

((pop!) (lambda ()

(if (null? stk)

(error "Stack empty")

(set! stk (cdr stk)))))

((top) (lambda ()

(if (null? stk)

(error "Stack empty")

(car stk))))

(else (error "stack: Invalid message" message)))))))

VARMO VENE 22

Page 23: varmo vene

PROGRAMMEERIMISKEELED

Magasin (ver. 3)

> (define s1 (make-stack))

> (define s2 (make-stack))

> ((s1 ’push!) 1)

> ((s2 ’push!) 2)

> ((s1 ’top))

1

> ((s2 ’top))

2

VARMO VENE 23

Page 24: varmo vene

PROGRAMMEERIMISKEELED

Järgmiseks korraks

• Lugeda läbi EOPL ptk. 4.5, 4.6

• Saata 1. kodutöö lahendused

– NB! Lahendustes mitte kasutada imperatiivseid

konstruktsioone

VARMO VENE 24