functions robin burke csc 358/458 4.10.2006. outline errata homework #2 project structures functions...

39
Functions Robin Burke CSC 358/458 4.10.2006

Upload: shannon-atkin

Post on 31-Mar-2015

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Functions

Robin Burke

CSC 358/458

4.10.2006

Page 2: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Outline

Errata Homework #2 Project Structures Functions

review parameter lists anonymous fns closures recursion tail recursion

Example

Page 3: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

CLOS solution

How many?

Page 4: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Errata

appenddoes consit build a new list for the front partshares structure with the last part

Page 5: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Homework #2

Page 6: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Project

Develop your own Lisp application Not restricted to implementing a game Timeline

4/17 Proposal5/1 Accepted proposal5/22 Progress report6/7 Due

Page 7: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Structures

Annoying to define a pile of accessors Alternative

defstruct Defines a structure

a named typewith slots

Page 8: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

defstruct

Definesaccessorsmutatorsconstructorread macro

Page 9: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

(defstruct card suit rank) Defines

make-cardcard-suitcard-rankalso#S(CARD :SUIT S :RANK 1)

• will be read and turned into a card object

Page 10: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Functions

Defined with defun, butjust a convenience

Real issuesymbol-function binding

Page 11: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Calling Functions

Normal evaluation(+ 1 2 3)

Othersfuncallapplyavoid eval

Page 12: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Multiple values

Let equivalentmultiple-value-bind

setq equivalentmultiple-value-setq

Example(multiple-value-bind (div rem) (floor num 10)... rest of code ...)

Alsomultiple-value-list

Page 13: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

add-digits

Page 14: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Parameter Lists

keywords(defun foo (a &key b c) ... )(foo 5 :b 10 :c 19)(foo 5)

rest(defun foo (&rest lst) ... )(foo)(foo 10 15 25 30)

optional(defun foo (a &optional b c) ... )(foo 5)(foo 5 10 19)

Page 15: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Anonymous Functions

Like anonymous classes in Java but...

lambda a macro that creates function objects(lambda (x) (* x x)

Can create functions where needed useful as functional arguments(mapcar #'(lambda (x) (* x x)) '(1 2 3))

Can write functions to return functional values

Page 16: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

numeric series

Page 17: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Closures

Shared lexical variable(defun integers ()

(let ((n 0))

(values #'(lambda () (incf n))

#'(lambda () (setf n 0)))))

Closurebinds variables in external scopekeeps them when the scope

disappears

Page 18: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Environment

Evaluation takes place in an environmentbindings for symbols

Hierarchy of environmentsglobal environmentlocal environments

"Lexical context"

Page 19: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

(defun bar (arg1 arg2)

(let ((var1 (baz arg1 arg2)))

#'(lambda () (foo var1))))

(setf fn (bar 'a 'b))

Page 20: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

When Closure is Created

Globalenvironment

Function

defun ...defparameter ...

(arg1 arg2)

Let (let ((var1...

Lambda(lambda () (foo var1 ...)

Page 21: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

When Closure is Returned

Let (let ((var1...

Lambda(lambda () (foo var1 ...)

Globalenvironment

fn

Page 22: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Encapsulation

Achieves OO goalvariables in closure are totally

inaccessibleno way to refer to their bindingsno way to even access that

environment

Page 23: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

Bank account

Page 24: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Compare with Java

Anonymous classes External values only if

instance variablesfinal variables

Page 25: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Anonymous Class (illegal)

JButton okButton = new JButton ("OK"); okButton.addActionListener ( new ActionListener () { public void actionPerformed (ActionEvent e) { m_canceled = false; okButton.setEnabled(false); } });

Page 26: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Anonymous Class (legal)

final JButton okButton = new JButton ("OK"); okButton.addActionListener ( new ActionListener () { public void actionPerformed (ActionEvent e) { m_canceled = false; okButton.setEnabled(false); } });

// BUT okButton = new JButton ("Yep"); // Illegal

Page 27: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Simulating a Closure in Java

final JButton [] arOkButton = new JButton [1];arOkButton[0] = new JButton ("OK");arOkButton[0].addActionListener ( new ActionListener () { public void actionPerformed (ActionEvent e) { m_canceled = false; arOkButton[0].setEnabled(false); } });

arOkButton[0] = new JButton ("Yep"); // Legal

Page 28: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Recursion

Basic frameworksolve simplest problem "base case"solve one piececombine with the solution to smaller

problem Why it works

eventually some call = base casethen all partial solutions are combined

Page 29: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Recursive Statement

Some problems have a natural recursive statementmaze followingpattern matching

Page 30: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

pattern matching

Page 31: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Double Recursion

Treesoperating on the "current" element

isn't simplerecurse on both car and cdr

Strategybase casecombine solution-to-car with solution-

to-cdr

Page 32: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Example

count-leaves

Page 33: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Recursive Stack

(defun factorial (n)

(if (= 0 n) 1 (* n (factorial (1- n)))

n = 5

n = 4

n = 3

n = 2

n = 1

n = 0 1

(* 1 1)

(* 2 1)

(* 3 2)

(* 4 6)

(* 5 24)

120

Page 34: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Tail Recursion

Avoid revisiting previous context = no after-the-fact assembly

New formulation accumulate answer in parameter base case = return answer recursive step

• do partial solution and pass as answer parameter Effect

do need to revist context recursive call = GOTO!

Page 35: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Tail Recursive Factorial

(defun factorial (n) (factorial-1 n 1))

(defun factorial-1 (n ans)

(if (= 0 n) ans (factorial-1 (1- n) (* n ans))))

n = 5, ans = 1

n = 4, ans = 5

n = 3, ans = 20

n = 2, ans = 60

n = 1, ans = 120

n = 0, ans = 120 120

120

120

120

120

120

120

Page 36: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Exercise

average

Page 37: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Symbolic Programming Example

iterators

Page 38: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Homework #3

Crazy Eights Create a playable game

change the game state to use a closure

add a function that chooses a move for the computer players

Page 39: Functions Robin Burke CSC 358/458 4.10.2006. Outline Errata Homework #2 Project Structures Functions review parameter lists anonymous fns closures recursion

Lab