Presentation is loading. Please wait.

Presentation is loading. Please wait.

Cs784(Prasad)L123Assg1 Assignments. cs784(Prasad)L123Assg2 l-value vs. r-value Pascal/Ada: x := x + 1 C/Java: x = x + 1 l-value = location, address, reference,

Similar presentations


Presentation on theme: "Cs784(Prasad)L123Assg1 Assignments. cs784(Prasad)L123Assg2 l-value vs. r-value Pascal/Ada: x := x + 1 C/Java: x = x + 1 l-value = location, address, reference,"— Presentation transcript:

1 cs784(Prasad)L123Assg1 Assignments

2 cs784(Prasad)L123Assg2 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

3 cs784(Prasad)L123Assg3 Sharing 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);

4 cs784(Prasad)L123Assg4 Side-effect causing Scheme primitives Initialize variable: (define ) Update variable: (set! ) Other ops: display, write, set-car!, set-cdr!,... (set! x y) denotes location denotes value Sequencing: (begin … )

5 cs784(Prasad)L123Assg5 Extending object (not meta-) language and the interpreter to support variable assignment

6 cs784(Prasad)L123Assg6 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)))

7 cs784(Prasad)L123Assg7 Introduction of variable assignment Syntax ::= set = Abstract Syntax varassign-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

8 cs784(Prasad)L123Assg8 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 )

9 cs784(Prasad)L123Assg9 Simulating Objects and Classes

10 cs784(Prasad)L123Assg10 Defining a stack object (define empty? ' ()) (define push! ' ()) (define pop! ' ()) (define top ' ()) stk (let ( (stk ' ()) ) stk (set! empty? (lambda() (null? stk))) (set! push! (lambda(x) stkstk (set! stk (cons x stk)))) (set! pop! (lambda() stkstk (set! stk (cdr stk)))) stk (set! top (lambda() (car stk))) )

11 cs784(Prasad)L123Assg11 Using the stack object > (empty?) #t > (push! 5) > (top) 5 > (pop!) > (empty?) #t oneOnly one stack object. Scope stk lifetimeScope of stk is limited ( encapsulation ), but its lifetime is not. pvt –representation pvt. public –methods public. PersistentPersistent state. share data change stateOps. share data and change state.

12 cs784(Prasad)L123Assg12 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 ) ) )))

13 cs784(Prasad)L123Assg13 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 1 ›( (s2 ' top) ) 2

14 cs784(Prasad)L123Assg14 Instance/Object vs. Class/Type (define stack (let ((stk ' ()) ) (lambda (msg) (case msg... ) )) ) make- (define make-stack (lambda() (let ((stk ' ()) ) (lambda (msg) (case msg... ) )) ) ))) ))

15 cs784(Prasad)L123Assg15 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 ) ))) ) )

16 cs784(Prasad)L123Assg16 class Template for class 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) )) ) )

17 cs784(Prasad)L123Assg17 (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))))) )))

18 cs784(Prasad)L123Assg18 make-stack (lambda () (let (…) … ) pushed = 0 (make-stack) (lambda (msg) … ) stk = () local-pushed = 0 (lambda (msg) … ) stk = () local-pushed = 0

19 cs784(Prasad)L123Assg19 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); }...

20 cs784(Prasad)L123Assg20... 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; } }

21 cs784(Prasad)L123Assg21 Approximate Environment

22 cs784(Prasad)L123Assg22 Rewrite in Java public class Test { public static void main(String [] args) { 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(); }

23 cs784(Prasad)L123Assg23 Approximate Environment

24 cs784(Prasad)L123Assg24 Inheritance Sharereuse Share and reuse classes with modifications to fields and methods productivity evolution Improve programmer productivity and aid code evolution

25 cs784(Prasad)L123Assg25 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)) ) ))))

26 cs784(Prasad)L123Assg26 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

27 cs784(Prasad)L123Assg27 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.

28 cs784(Prasad)L123Assg28 Composition and Delegation in Java class 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 }

29 cs784(Prasad)L123Assg29 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(); }

30 cs784(Prasad)L123Assg30 Binding: Dynamic vs Static class 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(); }}

31 cs784(Prasad)L123Assg31 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.


Download ppt "Cs784(Prasad)L123Assg1 Assignments. cs784(Prasad)L123Assg2 l-value vs. r-value Pascal/Ada: x := x + 1 C/Java: x = x + 1 l-value = location, address, reference,"

Similar presentations


Ads by Google