cs784(prasad)l123assg1 assignments. cs784(prasad)l123assg2 l-value vs. r-value pascal/ada: x := x +...

Post on 26-Dec-2015

213 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

cs784(Prasad) L123Assg 1

Assignments

cs784(Prasad) L123Assg 2

l-value vs. r-value

• Pascal/Ada: x := x + 1• C/Java: x = x + 1

l-value = location, address, reference, …

r-value = int, real, (sometimes even) address, …

Environment binds an identifier to a location.

env : ids locations

Store binds a location to a value.

store : locations values

assign-op : location x value x store store

cs784(Prasad) L123Assg 3

SharingSharing

• For functional subset, it is sufficient to model env as a function from ids to values.

• For imperative programming that has both assignment and sharing, separating env and store is necessary.

E.g., sharing/aliasing Point p = new Point();

Point q = p;

E.g., call by reference

void f(Point p){};

f(q);

cs784(Prasad) L123Assg 4

Side-effect causing Scheme primitives

• Initialize variable: (define <var> <exp>)• Update variable: (set! <var> <exp>)• Other ops: display, write,

set-car!, set-cdr!,...

(set! x y)denotes location denotes value

• Sequencing: (begin <exp1> <exp2> … <expn>)

cs784(Prasad) L123Assg 5

Extending object (not meta-) language and the interpreter to support variable

assignment

cs784(Prasad) L123Assg 6

Modifying environment and the interpreter

• An identifier denotes the address of a mutable data structure that holds a value (that is, it models a memory location).

• This address is called a reference, and the contents of these references are modified by a variable assignment.

• Variable reference

(var-exp (id) (deref (apply-env-ref env id)))

cs784(Prasad) L123Assg 7

Introduction of variable assignment• Syntax <expression> ::= set <identifier> = <expression>

• Abstract Syntaxvarassign-exp (id rhs-exp)

• Semantics (varassign-exp (var exp)

(set-ref! (apply-env-ref env id)

(eval-expression rhs-exp env) ) )

l-value

r-value

cs784(Prasad) L123Assg 8

Simulating letrec using let and assignment

(letrec ((var1 exp1) (var2 exp2)) exp) (* exp1 and exp2 are lambda-forms *)

(let ((var1 ’*) (var2 ’*)) (set! var1 exp1) (set! var2 exp2) exp)

cs784(Prasad) L123Assg 9

Simulating Objects and Classes

cs784(Prasad) L123Assg 10

Defining a stack object

(define empty? '())

(define push! '())

(define pop! '())

(define top '())

(let ( (stkstk '()) )

(set! empty? (lambda() (null? stkstk)))

(set! push! (lambda(x)

(set! stkstk (cons x stkstk))))

(set! pop! (lambda()

(set! stkstk (cdr stkstk))))

(set! top (lambda() (car stkstk)))

)

cs784(Prasad) L123Assg 11

Using the stack object

> (empty?)

#t

> (push! 5)

> (top)

5

> (pop!)

> (empty?)

#t

• Only oneone stack object.• ScopeScope of stkstk is

limited (encapsulation), but its lifetimelifetime is not.– representation pvtpvt.– methods publicpublic.

• PersistentPersistent state.• Ops. share datashare data and

change statechange state.

cs784(Prasad) L123Assg 12

stack object : Message passing style(define stack (let ( (stk '()) ) (lambda (msg) (case msg ((empty?) (lambda () (null? stk)) ) (( push!) (lambda (x) (set! stk (cons x stk))) ) (( pop! ) (lambda () (set! stk (cdr stk))) ) ((top) (lambda () (car stk)) ) (else 'error ) ) )))

cs784(Prasad) L123Assg 13

Object vs. Class

> (stack 'empty?) > ((stack 'empty?)) #t

> ((stack 'push!) 5)

> ((stack 'top)) 5

> ((stack 'empty?)) () or #f

> ((stack 'pop!)) > ((stack 'empty?)) #t

› (define s1 (make-stack))› (define s2 (make-stack))› ((s1 'push!) 1)› ((s2 'push!) 2)› ( (s1 'top) ) 1› ( (s1 'top) ) 1› ( (s2 'top) ) 2

cs784(Prasad) L123Assg 14

Instance/Object vs. Class/Type

(define stack

(let ((stk '()) )

(lambda (msg)

(case msg

...

)

))

)

(define make-make-stack

(lambda()(lambda()

(let ((stk '()) )

(lambda (msg)

(case msg

...

)

))

)))

cs784(Prasad) L123Assg 15

stack class : Message passing style(define make-stack (lambda ()

(let ( (stk '()) )

(lambda (msg)

(case msg

((empty?) (lambda () (null? stk)) )

(( push!) (lambda (x)

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

(( pop! ) (lambda ()

(set! stk (cdr stk))) )

((top) (lambda () (car stk)) )

(else 'error ) )))

))

cs784(Prasad) L123Assg 16

Template for classclass definition(define class-name (let ((class-var val)) (lambda () (let ((inst-var val)) (lambda (msg) (case msg ((m1) code) ((m2) code) ((c3) code) (else ’error) ))) ) ) )

cs784(Prasad) L123Assg 17

(define make-stack (let ((pushed 0)) (lambda () (let ((stk '()) (local-pushed 0) ) (lambda (message) (case message ((empty?) (lambda () (null? stk))) ((push!) (lambda (x) (set! pushed (+ pushed 1)) (set! local-pushed (+ local-pushed 1)) (set! stk (cons x stk)))) ((pop!) (lambda () (if (null? stk) (error "Stack: Underflow") (begin (set! pushed (- pushed 1)) (set! local-pushed (- local-pushed 1)) (set! stk (cdr stk)))))) ((top) (lambda () (if (null? stk) (error "Stack: Underflow") (car stk)))) ((local-pushed) (lambda () local-pushed)) ((pushed) (lambda () pushed)) (else (error "Stack: Invalid message" message))))) )))

cs784(Prasad) L123Assg 18

make-stack

(lambda () (let (…) … ))

pushed = 0

(make-stack) (make-stack)

(lambda (msg) … )

stk = ()local-pushed = 0

(lambda (msg) … )

stk = ()local-pushed = 0

cs784(Prasad) L123Assg 19

Rewrite in Java public class Stackclass { static int pushed; private Vector stk; private int localpushed; static { pushed := 0 } public Stackclass(){ localpushed = 0; stk = new Vector(); } public boolean empty() { return stk.isEmpty() }; public void push(Object x){ pushed++; localpushed++; stk.addElement(x);

} ...

cs784(Prasad) L123Assg 20

... public void pop(){

if (stk.isEmpty()) throw new Exception(“Stack Empty”); else { --pushed; --localpushed;

stk.removeElementAt(stk.size()-1); }

} public Object top(){ if (empty())

throw new Exception(“Stack Empty”); else return stk.lastElement();

} public int pushed() { return pushed; } public int localpushed(){ return localpushed; }}

cs784(Prasad) L123Assg 21

Approximate Environment

cs784(Prasad) L123Assg 22

Rewrite in Javapublic class Test { public static void main(String [] args) { Stackclass stack1 = new Stackclass(); Stackclass stack1 = new Stackclass(); stack1.push(new Integer(7)); stack1.top(); stack2.push(new Integer(6)); stack2.push(new Integer(8)); stack2.top(); stack1.localpushed(); stack2.localpushed(); stack1.pushed(); stack2.pushed(); }}

cs784(Prasad) L123Assg 23

Approximate Environment

cs784(Prasad) L123Assg 24

Inheritance

ShareShare and reusereuse classes with modifications to fields and methods

Improve programmer productivityproductivity and aid code evolutionevolution

cs784(Prasad) L123Assg 25

Delegation

(define make-bounded-stack (lambda (n) (let ((bound n) (stk (make-stack))) (lambda (message) (case message ((push!) (if (< ((stk 'local-pushed)) bound) (stk 'push!) (error ”Overflow”))) ((set-bound!) (lambda (x) (set! bound x))) ((set-stack!) (lambda (s) (set! stk s))) (else (stk message)) )

))))

cs784(Prasad) L123Assg 26

Delegation vs Inheritance

• Code sharing by organization of objects. Delegate message handling.

• Dynamic and flexible. When and how to delegate can depend on system state.

• E.g., Java 1.1 Event Model

• Code sharing by organization of classes. Single vs multiple inheritance.

• Static but efficient. Type determines message interpretation.

• E.g., Java 1.0 Event Model

cs784(Prasad) L123Assg 27

Inheritance in Java class Boundedstackclass extends Stack { private int bound; Boundedstackclass() { super(); bound = 10; } public void push(Object x) { if (size() < bound) super.push(x); else new Exception(”Overflow”); } public void setbound(int x){ bound = x; } }

• Specify only incremental changes.• Access parent’s version of a method through super.

cs784(Prasad) L123Assg 28

Composition and Delegation in Javaclass Boundedstackclass { private int bound; private Stack stk; Boundedstackclass() { stk = new Stack(); bound = 10; } public void push(Object x) { if (size() < bound) stk.push(x); else new Exception(”Overflow”); } public void setbound(int x){ bound = x; } public Object top() { return stk.top(); } ... Explicit list of other delegated stack methods }

cs784(Prasad) L123Assg 29

Scoping: Lexical vs Static

class A { static int cv; int iv;}

class Test { public static void main(String [] args){ int iv, cv;

class B extends A { void print() { System.out.print( “”+ cv + iv ); /*error*/

System.out.println( “”+this.cv +this.iv ); } } new B(). print(); } }

cs784(Prasad) L123Assg 30

Binding: Dynamic vs Staticclass A { static int cv = 10; int iv = 70; int f() {return 40;} void print() { System.out.println( “”+ cv + iv + f());}}class B extends A { static int cv = 33 ; int iv = 88; int f() {return 55;}}class Test2 { public static void main(String [] args){ new A(). print(); new B(). print();}}

cs784(Prasad) L123Assg 31

Advanced Topics

• Multiple Inheritance• E.g., C++, Eiffel.

• Meta-classes• E.g., Smalltalk.

• Inner/Nested classes• E.g., Java.

• Polymorphic Static Typing• E.g., ML, Haskell.

top related