# TAIL RECURSION, SCOPE, AND PROJECT 4 11

Size: px
Start display at page:

Download "TAIL RECURSION, SCOPE, AND PROJECT 4 11"

Transcription

1 TAIL RECURSION, SCOPE, AND PROJECT 4 11 COMPUTER SCIENCE 61A Noveber 12, Tail Recursion Today we will look at Tail Recursion and Tail Call Optimizations in Scheme, and how they relate to iteration in Python. Let s start with an example: From Lecture Notes: Implementations of Scheme are required to be properly tail-recursive. This allows the execution of an iterative computation in constant space, even if the iterative computation is described by a syntactically recursive procedure. def exp(b, n): #Theta(N) time and space if n == 0: return 1 return b * exp(b, n-1) def exp(b, n): #Theta(N) time but Theta(1) space total = 1 for _ in range(n): total = total * b return total But we don t have for and while iterative constructs in scheme (well we do, but we don t use them), so how do we accomplish same idea? 1

2 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page Optimized Tail Call Factorial: (define (factorial n k) (if (= n 0) k (factorial (- n 1) (* k n)))) Note the similarities and differences of the above procedure to a python version using a while loop. def factorial(n, k): while n > 0: n, k = n-1, k*n return k So how exactly is this an optimization, let s look at how the two different versions of scheme factorial (one recursive, and one tail recursive), and how they grow in space. Procedure Growth in Space (from Wikipedia) Recursive: call factorial (3) 3 * call factorial(2) 3 * 2 * call factorial(1) 3 * 2 * 1 * call factorial(0) 3 * 2 * 1 * 1 3 * 2 * 1 3 * 2 return 6 More efficient tail recursive, in terms of both space and time: call factorial (3) call fact (3 1) call fact (2 3) call fact (1 6) call fact (0 6) return 6 Note that the optimization we are witnessing here is not an optimization in time, but in space. In most examples in this class we have looked at time growth of a procedure, but a procedure can also be analyzed by how much space it uses either in memory, cache, or CPU. These topics will be explored more in depth CS61C. Here, both these functions (one recursive, one tail recursive), both are linear recursions that both take linear time.

3 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 3 But the optimization comes in that the tail recursive version uses constant space (or space that does not grow with respect to the input), where as the recursive version also grows linearly in space with respect to its input. Exact Definition of Tail Recursive Calls (from lecture) : A procedure call that has not yet returned is active. Some procedure calls are tail calls. A Scheme interpreter should support an unbounded number of active tail calls. A tail call is a call expression in a tail context: **Note: A call expression is not a tail call if more computation is still required in the calling procedure. Linear recursions can often be re-written to use tail calls. 1.2 Questions 1. Write a function last, which takes in a list and returns the last element of the list: (define (last s)) 2. Write the function that returns the nth Fibonacci number (try writing recursive first, then think tail recursive). ;Tree-recursive version: (define (fib-tree n) ;Tail-recursive version: (define (fib n)

4 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 4 3. Write a function that inserts number n into a sorted list of numbers, s. (once again try writing recursive version first, then think tail-recursive). ;Non-tail-recursive version (define (insert-non-tail n s) ; From lecture: reverse-iter (define (reverse-iter s result) (if (null? s) result (reverse-iter (cdr s) (cons (car s) result)))) ;Tail-recursive version (Hint: Use a helper function) (define (insert n s) Note: Not all recursive procedures can be rewritten in a tail recursive pattern, and the tricky part is understanding which ones can t, for instance the subset-sum problem. 2 Lexical Scope Vs Dynamic Scope To this point in the class, we have only talked about Lexical Scoping. Remember that the scoping rule is the environment diagram rule that decides what a new frame s parent is when the frame is created. So when a procedure is called, a new frame is created, that frame needs a parent, and whatever scoping rule you are using will decide what that

5 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 5 parent frame is. Basically, this rule determines what will be in scope for that new frame, or what variables it will be able to see. While some languages (not many) let you choose which scoping to use when defining a variable, most use lexical. However, dynamic is usually a good step towards fully understanding lexical scoping, and so it is good to learn both. (You will have to implement both in your project). Lexical scope: The parent of a frame is the environment in which a procedure was defined. Dynamic scope: The parent of a frame is the environment in which a procedure was called Lexical Scoping also relates heavily to closures, a closure (in simplest terms) is a procedure that is also bound with the environment frame it was defined in, this is necessary so that the procedure will know what frame to extend when it is called, otherwise, it would not be able to tell. This is why in your project, and lambda has a frame instance variable. While python is lexically scoped, you will need to be able to draw environment diagrams using both scoping rules, and it is possible that a question like this could show up on the final! 2.1 Problems 1. Draw the environment diagram for the following code, first with Lexical Scoping, and then with Dynamic Scoping. : x = 10 def foo(x): return x * bar(2) def bar(y): return y + x foo(3)

6 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 6 2. def make_counter(x): def count(m): nonlocal x if m == inc : x += 1 elif m== count : return x return count c1 = make_counter(5) c2 = make_counter(7) c1( inc ) c1( inc ) c1( count )

7 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 7 3 Project 4: Scheme Interpreter For the rest of discussion, we will discuss your project at a high level, this is a chance to really look at the code, and go over as a group what is going on with the skeleton code you have been given for the project, and the ideas you are expected to implement, please ask questions. For your project you need to fill in the missing pieces of the scheme interpreter. This involves completing the missing aspects of the read-eval-print loop. You will implement a few basic functions to parse scheme expressions for the reader, and then besides that most of the project will be spent working in the eval phase. Eval, for most complex interpreters, involves a loop of its own, called the eval-apply loop. To this point, our interpreters have been simple. In our calculator interpreter, we called eval, which called apply, which finished. But now that we want to have user defined procedures, which have their own bodies which need to be evaluated, so apply may now also need to call eval to interpret an answer. This will be an example of Mutual Recursion. There will also be more bells and whistles wrapped around this which you will have to figure out, but for now lets look at the meat of the code for the project. Some comments have been included to help you understand what is going on. Your TA will explain this code. def scheme_eval(expr, env): """Evaluate Scheme expression EXPR in environment ENV.""" #The expression must not be none if expr is None: raise SchemeError("Cannot evaluate an undefined expression.") # Evaluate Atoms """If the atom is a symbol (either a primitive procedure symbol, or variable, look it up!)""" if scheme_symbolp(expr): return env.lookup(expr) # if its primitive (number, etc), simply return elif scheme_atomp(expr): return expr # All non-atomic expressions are lists. if not scheme_listp(expr): raise SchemeError("malformed list: {0}".format(str(expr))) first, rest = expr.first, expr.second

8 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 8 #Special Form Evaluation Comes Next # Evaluate Combinations if first in LOGIC_FORMS: return scheme_eval(logic_forms[first](rest, env), env) #evaluate lambda special form elif first == "lambda": return do_lambda_form(rest, env) #evaluate mu special form elif first == "mu": return do_mu_form(rest) #evaluate define special form elif first == "define": return do_define_form(rest, env) #evaluate quote special form elif first == "quote": return do_quote_form(rest) #evaluate let special form elif first == "let": expr, env = do_let_form(rest, env) return scheme_eval(expr, env) #not a special form, apply normal scheme rules of evaluation else: """evaluate the operator (in case its a variable, this is different from calculator)""" procedure = scheme_eval(first, env) #map scheme_eval to args, eval in current env args = rest.map(lambda operand: scheme_eval(operand, env)) #apply procedure to evaluated args return scheme_apply(procedure, args, env) def scheme_apply(procedure, args, env): """Apply Scheme PROCEDURE to argument values ARGS in environment ENV.""" #handle primitive, happen by magic through underlying python if isinstance(procedure, PrimitiveProcedure): return apply_primitive(procedure, args, env) #handle lambdas, use lexical scope elif isinstance(procedure, LambdaProcedure): "*** YOUR CODE HERE ***" #handle mus, use dynamic scope

9 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 9 elif isinstance(procedure, MuProcedure): "*** YOUR CODE HERE ***" else: raise SchemeError("Cannot call {0}".format(str(procedure))) #Primitives don t create a new env, get applied in current env def apply_primitive(procedure, args, env): """Apply PrimitiveProcedure PROCEDURE to a Scheme list of ARGS in ENV.""" Try and answer the following questions, there is not an exact answer to these questions that we are looking for, but rather this is to get you to think about interpreters, and scheme-eval, you can just describe your answers. These are questions you will have to answer in your project in order to write the code. 3.1 Questions 1. Why does scheme-eval check in order of atoms, symbols, special forms, then normal application? What would go wrong if it didn t? 2. Why does the operator to scheme-eval also have to be evaluated (unlike calculator), what could the operator be? 3. When a procedure is called, which frame are its arguments evaluated in?

10 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page Why does scheme-eval pass the current env to scheme-apply? 5. Should scheme-apply s implementation call scheme-eval? If yes then where? 6. What frame do primitive procedures get evaluated in? Should they create a new frame? Should lambdas or mus? 7. True or False: All define does is point variables to values in the current frame, it does not actually make a procedure. 3.2 Frames Now lets look at Frames, and the differences between Primitives, Lambdas, and Mus Each class keeps tracks of the items that are necessary for it to behave properly. Each Frame

11 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 11 maintains a dictionary of bindings of variables to values, and a parent frame, which can be None (for instance for the global frame). The Frame also supports methods to lookup variables starting from its given location on its environment chain, and to add variables to its bindings. The Lambda and Mu classes are for User Defined Procedures, they keep track of formals, which is a list of argument names, and a body, which will be another scheme expression. The difference between the two is that lambdas also keep track of the environment they were created in, why? We will answer that in a minute. There is also PrimitiveProcedures which are neither lambdas nor mus, they are builtin and do not require a new frame to be evaluated. This is because for our purposes, as always, we dont care how primitives happen, we just assume they happen magically. In general, no frames are created for the application of primitives, but some may need a frame, and so we have the option to pass a frame in, and you will deal with these cases in the project. For our interpreter we will let underlying python handle the scheme primitives. So then a PrimitiveProcedure in our interpreter is an instance of a class that maintains the underlying python function it uses, an env if necessary, plus a static list of all Primitives. Here is the skeleton code from the project for the Frame, LambaProcedure, MuProcedure, and PrimitiveProcedure classes. class Frame(object): """An environment frame binds Scheme symbols to Scheme values.""" def init (self, parent): """An empty frame with a PARENT frame (that may be None).""" self.bindings = {} self.parent = parent def lookup(self, symbol): """Return the value bound to SYMBOL. Errors if SYMBOL is not found.""" raise SchemeError("unknown identifier: {0}".format(str(symbol))) def global_frame(self): """The global environment at the root of the parent chain.""" e = self while e.parent is not None: e = e.parent return e def make_call_frame(self, formals, vals):

12 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 12 """Return a new local frame whose parent is SELF, in which the symbols in the Scheme formal parameter list FORMALS are bound to the Scheme values in the Scheme value list VALS. """ frame = Frame(self) return frame def define(self, sym, val): """Define Scheme symbol SYM to have value VAL in SELF.""" self.bindings[sym] = val class LambdaProcedure(object): """A procedure defined by a lambda expression or the complex define form.""" def init (self, formals, body, env): """A procedure whose formal parameter list is FORMALS (a Scheme list), whose body is the single Scheme expression BODY, and whose parent environment is the Frame ENV. A lambda expression containing multiple expressions, such as (lambda (x) (display x) (+ x 1)) can be handled by using (begin (display x) (+ x 1)) as the body.""" self.formals = formals self.body = body self.env = env class MuProcedure(object): """A procedure defined by a mu expression, which has dynamic scope.""" def init (self, formals, body): """A procedure whose formal parameter list is FORMALS (a Scheme list), whose body is the single Scheme expression BODY. A mu expression containing multiple expressions, such as (mu (x) (display x) (+ x 1)) can be handled by using (begin (display x) (+ x 1)) as the body.""" self.formals = formals self.body = body

13 DISCUSSION 11: TAIL RECURSION, SCOPE, AND PROJECT 4 Page 13 class PrimitiveProcedure: """A Scheme procedure defined as a Python function.""" def init (self, fn, use_env=false): self.fn = fn self.use_env = use_env _PRIMITIVES = [] Once again, here are some high level questions to answer about this code, and to get you thinking about the project if you havent already. 3.3 Questions 1. Write pseudocode or a description of how you would implement lookup for frames. 2. When would make_call_frame be used? How does this relate to Mus? 3. Why do lambdas have an env but mus don t, when would you use the env instance variable in lambdas?

### SCHEME AND CALCULATOR 5b

SCHEME AND CALCULATOR 5b COMPUTER SCIENCE 6A July 25, 203 In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme programs,

### Summer 2017 Discussion 10: July 25, Introduction. 2 Primitives and Define

CS 6A Scheme Summer 207 Discussion 0: July 25, 207 Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme programs,

### SCHEME 8. 1 Introduction. 2 Primitives COMPUTER SCIENCE 61A. March 23, 2017

SCHEME 8 COMPUTER SCIENCE 61A March 2, 2017 1 Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme programs,

### CS61A Notes Week 13: Interpreters

CS61A Notes Week 13: Interpreters Read-Eval Loop Unlike Python, the result of evaluating an expression is not automatically printed. Instead, Logo complains if the value of any top-level expression is

### INTERPRETERS 8. 1 Calculator COMPUTER SCIENCE 61A. November 3, 2016

INTERPRETERS 8 COMPUTER SCIENCE 61A November 3, 2016 1 Calculator We are beginning to dive into the realm of interpreting computer programs that is, writing programs that understand other programs. In

### Fall 2018 Discussion 8: October 24, 2018 Solutions. 1 Introduction. 2 Primitives

CS 6A Scheme Fall 208 Discussion 8: October 24, 208 Solutions Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write

### Interpreters and Tail Calls Fall 2017 Discussion 8: November 1, 2017 Solutions. 1 Calculator. calc> (+ 2 2) 4

CS 61A Interpreters and Tail Calls Fall 2017 Discussion 8: November 1, 2017 Solutions 1 Calculator We are beginning to dive into the realm of interpreting computer programs that is, writing programs that

### Spring 2018 Discussion 7: March 21, Introduction. 2 Primitives

CS 61A Scheme Spring 2018 Discussion 7: March 21, 2018 1 Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme

### 6.184 Lecture 4. Interpretation. Tweaked by Ben Vandiver Compiled by Mike Phillips Original material by Eric Grimson

6.184 Lecture 4 Interpretation Tweaked by Ben Vandiver Compiled by Mike Phillips Original material by Eric Grimson 1 Interpretation Parts of an interpreter Arithmetic calculator

### Fall 2017 Discussion 7: October 25, 2017 Solutions. 1 Introduction. 2 Primitives

CS 6A Scheme Fall 207 Discussion 7: October 25, 207 Solutions Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write

### Functional Programming. Pure Functional Programming

Functional Programming Pure Functional Programming Computation is largely performed by applying functions to values. The value of an expression depends only on the values of its sub-expressions (if any).

### SCHEME 7. 1 Introduction. 2 Primitives COMPUTER SCIENCE 61A. October 29, 2015

SCHEME 7 COMPUTER SCIENCE 61A October 29, 2015 1 Introduction In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme programs,

### ENVIRONMENT DIAGRAMS AND RECURSION 2

ENVIRONMENT DIAGRAMS AND RECURSION 2 COMPUTER SCIENCE 61A February 4, 2016 1 Environment Diagrams An environment diagram keeps track of all the variables that have been defined and the values they are

### SCHEME 10 COMPUTER SCIENCE 61A. July 26, Warm Up: Conditional Expressions. 1. What does Scheme print? scm> (if (or #t (/ 1 0)) 1 (/ 1 0))

SCHEME 0 COMPUTER SCIENCE 6A July 26, 206 0. Warm Up: Conditional Expressions. What does Scheme print? scm> (if (or #t (/ 0 (/ 0 scm> (if (> 4 3 (+ 2 3 4 (+ 3 4 (* 3 2 scm> ((if (< 4 3 + - 4 00 scm> (if

### Project 2: Scheme Interpreter

Project 2: Scheme Interpreter CSC 4101, Fall 2017 Due: 12 November 2017 For this project, you will implement a simple Scheme interpreter in C++ or Java. Your interpreter should be able to handle the same

### INTERPRETERS AND TAIL CALLS 9

INTERPRETERS AND TAIL CALLS 9 COMPUTER SCIENCE 61A April 9, 2015 We are beginning to dive into the realm of interpreting computer programs that is, writing programs that understand other programs. In order

### Scheme in Scheme: The Metacircular Evaluator Eval and Apply

Scheme in Scheme: The Metacircular Evaluator Eval and Apply CS21b: Structure and Interpretation of Computer Programs Brandeis University Spring Term, 2015 The metacircular evaluator is A rendition of Scheme,

### CS 61A Interpreters, Tail Calls, Macros, Streams, Iterators. Spring 2019 Guerrilla Section 5: April 20, Interpreters.

CS 61A Spring 2019 Guerrilla Section 5: April 20, 2019 1 Interpreters 1.1 Determine the number of calls to scheme eval and the number of calls to scheme apply for the following expressions. > (+ 1 2) 3

### 6.037 Lecture 4. Interpretation. What is an interpreter? Why do we need an interpreter? Stages of an interpreter. Role of each part of the interpreter

6.037 Lecture 4 Interpretation Interpretation Parts of an interpreter Meta-circular Evaluator (Scheme-in-scheme!) A slight variation: dynamic scoping Original material by Eric Grimson Tweaked by Zev Benjamin,

### Why do we need an interpreter? SICP Interpretation part 1. Role of each part of the interpreter. 1. Arithmetic calculator.

.00 SICP Interpretation part Parts of an interpreter Arithmetic calculator Names Conditionals and if Store procedures in the environment Environment as explicit parameter Defining new procedures Why do

### CS 360 Programming Languages Interpreters

CS 360 Programming Languages Interpreters Implementing PLs Most of the course is learning fundamental concepts for using and understanding PLs. Syntax vs. semantics vs. idioms. Powerful constructs like

### SCHEME INTERPRETER GUIDE 4

SCHEME INTERPRETER GUIDE 4 COMPUTER SCIENCE 61A July 28, 2014 1 Scheme Values Back in Python, we had all these objects (i.e. lists, tuples, strings, integers) which inherited from the superclass object.

### CS61A Discussion Notes: Week 11: The Metacircular Evaluator By Greg Krimer, with slight modifications by Phoebus Chen (using notes from Todd Segal)

CS61A Discussion Notes: Week 11: The Metacircular Evaluator By Greg Krimer, with slight modifications by Phoebus Chen (using notes from Todd Segal) What is the Metacircular Evaluator? It is the best part

### Scheme Basics > (butfirst '(help!)) ()

Scheme Basics > (butfirst '(help!)) () [The butfirst of a *sentence* containing one word is all but that word, i.e., the empty sentence. (BUTFIRST 'HELP!) without the inner parentheses would be butfirst

### 61A LECTURE 22 TAIL CALLS, ITERATORS. Steven Tang and Eric Tzeng July 30, 2013

61A LECTURE 22 TAIL CALLS, ITERATORS Steven Tang and Eric Tzeng July 30, 2013 Announcements Homework 12 due Thursday, not Monday. Take the time to get started on the project instead! Almost done with Scheme

### Fall Semester, The Metacircular Evaluator. Today we shift perspective from that of a user of computer langugaes to that of a designer of

1 MASSACHVSETTS INSTITVTE OF TECHNOLOGY Department of Electrical Engineering and Computer Science 6.001 Structure and Interpretation of Computer Programs Fall Semester, 1996 Lecture Notes { October 31,

### An Explicit Continuation Evaluator for Scheme

Massachusetts Institute of Technology Course Notes 2 6.844, Spring 05: Computability Theory of and with Scheme February 17 Prof. Albert R. Meyer revised March 3, 2005, 1265 minutes An Explicit Continuation

### MORE SCHEME. 1 What Would Scheme Print? COMPUTER SCIENCE MENTORS 61A. October 30 to November 3, Solution: Solutions begin on the following page.

MORE SCHEME COMPUTER SCIENCE MENTORS 61A October 30 to November 3, 2017 1 What Would Scheme Print? Solutions begin on the following page. 1. What will Scheme output? Draw box-and-pointer diagrams to help

### Intro. Scheme Basics. scm> 5 5. scm>

Intro Let s take some time to talk about LISP. It stands for LISt Processing a way of coding using only lists! It sounds pretty radical, and it is. There are lots of cool things to know about LISP; if

### Turtles All The Way Down

Turtles All The Way Down Bertrand Russell had just finished giving a public lecture on the nature of the universe. An old woman said Prof. Russell, it is well known that the earth rests on the back of

### Structure and Interpretation of Computer Programs

CS 61A Fall 2016 Structure and Interpretation of Computer Programs Final INSTRUCTIONS You have 3 hours to complete the exam. The exam is closed book, closed notes, closed computer, closed calculator, except

### Parsing Scheme (+ (* 2 3) 1) * 1

Parsing Scheme + (+ (* 2 3) 1) * 1 2 3 Compiling Scheme frame + frame halt * 1 3 2 3 2 refer 1 apply * refer apply + Compiling Scheme make-return START make-test make-close make-assign make- pair? yes

### CS 275 Name Final Exam Solutions December 16, 2016

CS 275 Name Final Exam Solutions December 16, 2016 You may assume that atom? is a primitive procedure; you don t need to define it. Other helper functions that aren t a standard part of Scheme you need

### Write a procedure powerset which takes as its only argument a set S and returns the powerset of S.

Answers to CS61 A Final of May 23, 1997 We repeat the questions; some have typos corrected with respect to the actual exam handed out. Question 1 (5 points): Let us represent a set S of unique expressions,

### Computer Science 21b (Spring Term, 2015) Structure and Interpretation of Computer Programs. Lexical addressing

Computer Science 21b (Spring Term, 2015) Structure and Interpretation of Computer Programs Lexical addressing The difference between a interpreter and a compiler is really two points on a spectrum of possible

### An introduction to Scheme

An introduction to Scheme Introduction A powerful programming language is more than just a means for instructing a computer to perform tasks. The language also serves as a framework within which we organize

### SCHEME The Scheme Interpreter. 2 Primitives COMPUTER SCIENCE 61A. October 29th, 2012

SCHEME COMPUTER SCIENCE 6A October 29th, 202 In the next part of the course, we will be working with the Scheme programming language. In addition to learning how to write Scheme programs, we will eventually

### Structure and Interpretation of Computer Programs

CS 6A Spring 203 Structure and Interpretation of Computer Programs Final Solutions INSTRUCTIONS You have 3 hours to complete the exam. The exam is closed book, closed notes, closed computer, closed calculator,

### STRUCTURE AND INTERPRETATION COMPUTER PROGRAMS >>> COMPUTER SCIENCE IN THE NEWS. CS61A Lecture 23 Py TODAY REVIEW: INTERPRETATION 7/26/2012 READ PRINT

COMPUTER SCIENCE IN THE NEWS CS61A Lecture 23 Py Jom Magrotker UC Berkeley EECS July 26, 2012 http://www.theverge.com/2012/7/26/3188043/robot-baby-osaka-university-asada-laboratory 2 TODAY Interpretation:

### Lexical vs. Dynamic Scope

Intro Lexical vs. Dynamic Scope where do I point to? Remember in Scheme whenever we call a procedure we pop a frame and point it to where the procedure points to (its defining environment). This is called

### Announcements. The current topic: Scheme. Review: BST functions. Review: Representing trees in Scheme. Reminder: Lab 2 is due on Monday at 10:30 am.

The current topic: Scheme! Introduction! Object-oriented programming: Python Functional programming: Scheme! Introduction! Numeric operators, REPL, quotes, functions, conditionals! Function examples, helper

### STRUCTURE AND INTERPRETATION COMPUTER PROGRAMS COMPUTER SCIENCE IN THE NEWS. CS61A Lecture 23 Py TODAY 7/26/2012

COMPUTER SCIENCE IN THE NEWS CS61A Lecture 23 Py Jom Magrotker UC Berkeley EECS July 26, 2012 http://www.theverge.com/2012/7/26/3188043/robot-baby-osaka-university-asada-laboratory 2 TODAY Interpretation:

### Streams, Delayed Evaluation and a Normal Order Interpreter. CS 550 Programming Languages Jeremy Johnson

Streams, Delayed Evaluation and a Normal Order Interpreter CS 550 Programming Languages Jeremy Johnson 1 Theme This lecture discusses the stream model of computation and an efficient method of implementation

### Below are example solutions for each of the questions. These are not the only possible answers, but they are the most common ones.

6.001, Fall Semester, 2002 Quiz II Sample solutions 1 MASSACHVSETTS INSTITVTE OF TECHNOLOGY Department of Electrical Engineering and Computer Science 6.001 Structure and Interpretation of Computer Programs

### Structure and Interpretation of Computer Programs

CS 6A Fall 206 Structure and Interpretation of Computer Programs Final Solutions INSTRUCTIONS You have hours to complete the exam. The exam is closed book, closed notes, closed computer, closed calculator,

### Structure and Interpretation of Computer Programs

CS 61A Summer 2014 Structure and Interpretation of Computer Programs Final Solutions INSTRUCTIONS ˆ You have 3 hours to complete the exam. ˆ The exam is closed book, closed notes, and closed electronics,

### 6.001 Notes: Section 15.1

6.001 Notes: Section 15.1 Slide 15.1.1 Our goal over the next few lectures is to build an interpreter, which in a very basic sense is the ultimate in programming, since doing so will allow us to define

### CS61A Lecture 23 Py. Jom Magrotker UC Berkeley EECS July 26, 2012

CS61A Lecture 23 Py Jom Magrotker UC Berkeley EECS July 26, 2012 COMPUTERSCIENCE IN THENEWS http://www.theverge.com/2012/7/26/3188043/robot-baby-osaka-university-asada-laboratory 2 TODAY Interpretation:

### User-defined Functions. Conditional Expressions in Scheme

User-defined Functions The list (lambda (args (body s to a function with (args as its argument list and (body as the function body. No quotes are needed for (args or (body. (lambda (x (+ x 1 s to the increment

### CSC324 Functional Programming Efficiency Issues, Parameter Lists

CSC324 Functional Programming Efficiency Issues, Parameter Lists Afsaneh Fazly 1 January 28, 2013 1 Thanks to A.Tafliovich, P.Ragde, S.McIlraith, E.Joanis, S.Stevenson, G.Penn, D.Horton 1 Example: efficiency

### Delayed Expressions Fall 2017 Discussion 9: November 8, Iterables and Iterators. For Loops. Other Iterable Uses

CS 6A Delayed Expressions Fall 07 Discussion 9: November 8, 07 Iterables and Iterators An iterable is any container that can be processed sequentially. Examples include lists, tuples, strings, and dictionaries.

### Functional Programming. Pure Functional Languages

Functional Programming Pure functional PLs S-expressions cons, car, cdr Defining functions read-eval-print loop of Lisp interpreter Examples of recursive functions Shallow, deep Equality testing 1 Pure

### An Introduction to Scheme

An Introduction to Scheme Stéphane Ducasse stephane.ducasse@inria.fr http://stephane.ducasse.free.fr/ Stéphane Ducasse 1 Scheme Minimal Statically scoped Functional Imperative Stack manipulation Specification

### (scheme-1) has lambda but NOT define

CS61A Lecture 12 2011-0-11 Colleen Lewis (calc) review (scheme-1) has lambda but NOT define Remember calc-apply? STk> (calc-apply '+ '(1 2 )) 6 STk> (calc-apply '* '(2 4 )) 24 STk> (calc-apply '/ '(10

### CSE341 Spring 2017, Final Examination June 8, 2017

CSE341 Spring 2017, Final Examination June 8, 2017 Please do not turn the page until 8:30. Rules: The exam is closed-book, closed-note, etc. except for both sides of one 8.5x11in piece of paper. Please

### ITERATORS AND STREAMS 9

ITERATORS AND STREAMS 9 COMPUTER SCIENCE 61A November 12, 2015 1 Iterators An iterator is an object that tracks the position in a sequence of values. It can return an element at a time, and it is only

### TAIL CALLS, ITERATORS, AND GENERATORS 11

TAIL CALLS, ITERATORS, AND GENERATORS 11 COMPUTER SCIENCE 61A November 13, 214 1 Tail Calls Scheme implements tail-call optimization, which allows programmers to write recursive functions that use a constant

### Principles of Programming Languages Topic: Functional Programming Professor L. Thorne McCarty Spring 2003

Principles of Programming Languages Topic: Functional Programming Professor L. Thorne McCarty Spring 2003 CS 314, LS, LTM: Functional Programming 1 Scheme A program is an expression to be evaluated (in

### This exam is worth 70 points, or about 23% of your total course grade. The exam contains 15 questions.

CS 61A Final Exam May 16, 2008 Your name login: cs61a This exam is worth 70 points, or about 23% of your total course grade. The exam contains 15 questions. This booklet contains 18 numbered pages including

### An Explicit-Continuation Metacircular Evaluator

Computer Science (1)21b (Spring Term, 2018) Structure and Interpretation of Computer Programs An Explicit-Continuation Metacircular Evaluator The vanilla metacircular evaluator gives a lot of information

### Organization of Programming Languages CS3200/5200N. Lecture 11

Organization of Programming Languages CS3200/5200N Razvan C. Bunescu School of Electrical Engineering and Computer Science bunescu@ohio.edu Functional vs. Imperative The design of the imperative languages

### Scheme. Functional Programming. Lambda Calculus. CSC 4101: Programming Languages 1. Textbook, Sections , 13.7

Scheme Textbook, Sections 13.1 13.3, 13.7 1 Functional Programming Based on mathematical functions Take argument, return value Only function call, no assignment Functions are first-class values E.g., functions

### CS 314 Principles of Programming Languages. Lecture 16

CS 314 Principles of Programming Languages Lecture 16 Zheng Zhang Department of Computer Science Rutgers University Friday 28 th October, 2016 Zheng Zhang 1 CS@Rutgers University Class Information Reminder:

### CS61A Midterm 2 Review (v1.1)

Spring 2006 1 CS61A Midterm 2 Review (v1.1) Basic Info Your login: Your section number: Your TA s name: Midterm 2 is going to be held on Tuesday 7-9p, at 1 Pimentel. What will Scheme print? What will the

### Functional Programming. Pure Functional Languages

Functional Programming Pure functional PLs S-expressions cons, car, cdr Defining functions read-eval-print loop of Lisp interpreter Examples of recursive functions Shallow, deep Equality testing 1 Pure

### Comp 311: Sample Midterm Examination

Comp 311: Sample Midterm Examination October 29, 2007 Name: Id #: Instructions 1. The examination is closed book. If you forget the name for a Scheme operation, make up a name for it and write a brief

### CS61A Summer 2010 George Wang, Jonathan Kotker, Seshadri Mahalingam, Eric Tzeng, Steven Tang

CS61A Notes Week 6B: Streams Streaming Along A stream is an element and a promise to evaluate the rest of the stream. You ve already seen multiple examples of this and its syntax in lecture and in the

### CSE341 Spring 2017, Final Examination June 8, 2017

CSE341 Spring 2017, Final Examination June 8, 2017 Please do not turn the page until 8:30. Rules: The exam is closed-book, closed-note, etc. except for both sides of one 8.5x11in piece of paper. Please

### CSc 520 Principles of Programming Languages

CSc 520 Principles of Programming Languages 9: Scheme Metacircular Interpretation Christian Collberg collberg@cs.arizona.edu Department of Computer Science University of Arizona Copyright c 2005 Christian

### MEMOIZATION, RECURSIVE DATA, AND SETS

MEMOIZATION, RECURSIVE DATA, AND SETS 4b COMPUTER SCIENCE 61A July 18, 2013 1 Memoization Later in this class, you ll learn about orders of growth and how to analyze exactly how efficient (or inefficient)

### RECURSION 3. 1 Recursion COMPUTER SCIENCE 61A. June 30, 2016

RECURSION 3 COMPUTER SCIENCE 61A June 30, 2016 A recursive function is a function that calls itself. Here s a recursive function: def factorial(n): if n == 0 or n == 1: return 1 else: return n * factorial(n-1)

### April 2 to April 4, 2018

MORE SCHEME COMPUTER SCIENCE MENTORS 61A April 2 to April 4, 2018 1 Scheme 1. What will Scheme output? Draw box-and-pointer diagrams to help determine this. (a) (cons (cons 1 nil) (cons 2 (cons (cons 3

### CSCC24 Functional Programming Scheme Part 2

CSCC24 Functional Programming Scheme Part 2 Carolyn MacLeod 1 winter 2012 1 Based on slides from Anya Tafliovich, and with many thanks to Gerald Penn and Prabhakar Ragde. 1 The Spirit of Lisp-like Languages

### More Scheme CS 331. Quiz. 4. What is the length of the list (()()()())? Which element does (car (cdr (x y z))) extract from the list?

More Scheme CS 331 Quiz 1. What is (car ((2) 3 4))? (2) 2. What is (cdr ((2) (3) (4)))? ((3)(4)) 3. What is (cons 2 (2 3 4))? (2 2 3 4) 4. What is the length of the list (()()()())? 4 5. Which element

### INF4820: Algorithms for Artificial Intelligence and Natural Language Processing. Common Lisp Fundamentals

INF4820: Algorithms for Artificial Intelligence and Natural Language Processing Common Lisp Fundamentals Stephan Oepen & Murhaf Fares Language Technology Group (LTG) August 30, 2017 Last Week: What is

### Principles of Programming Languages

Principles of Programming Languages www.cs.bgu.ac.il/~ppl172 Lesson 6 - Defining a Programming Language Bottom Up Collaboration and Management - Elements of Programming Dana Fisman 1 What we accomplished

### Comp 411 Principles of Programming Languages Lecture 7 Meta-interpreters. Corky Cartwright January 26, 2018

Comp 411 Principles of Programming Languages Lecture 7 Meta-interpreters Corky Cartwright January 26, 2018 Denotational Semantics The primary alternative to syntactic semantics is denotational semantics.

### Evaluating Scheme Expressions

Evaluating Scheme Expressions How Scheme evaluates the expressions? (procedure arg 1... arg n ) Find the value of procedure Find the value of arg 1 Find the value of arg n Apply the value of procedure

### Administrivia. Simple data types

Administrivia Lists, higher order procedures, and symbols 6.037 - Structure and Interpretation of Computer Programs Mike Phillips (mpp) Massachusetts Institute of Technology Project 0 was due today Reminder:

### ENVIRONMENT MODEL: FUNCTIONS, DATA 18

ENVIRONMENT MODEL: FUNCTIONS, DATA 18 COMPUTER SCIENCE 61A Jon Kotker and Tom Magrino July 18, 2012 1 Motivation Yesterday, we introduced the environment model of computation as an alternative to the earlier

### CSE413 Midterm. Question Max Points Total 100

CSE413 Midterm 05 November 2007 Name Student ID Answer all questions; show your work. You may use: 1. The Scheme language definition. 2. One 8.5 * 11 piece of paper with handwritten notes Other items,

### 6.001 Notes: Section 8.1

6.001 Notes: Section 8.1 Slide 8.1.1 In this lecture we are going to introduce a new data type, specifically to deal with symbols. This may sound a bit odd, but if you step back, you may realize that everything

### 6.001 Notes: Section 4.1

6.001 Notes: Section 4.1 Slide 4.1.1 In this lecture, we are going to take a careful look at the kinds of procedures we can build. We will first go back to look very carefully at the substitution model,

### Functional Programming Languages (FPL)

Functional Programming Languages (FPL) 1. Definitions... 2 2. Applications... 2 3. Examples... 3 4. FPL Characteristics:... 3 5. Lambda calculus (LC)... 4 6. Functions in FPLs... 7 7. Modern functional

### Documentation for LISP in BASIC

Documentation for LISP in BASIC The software and the documentation are both Copyright 2008 Arthur Nunes-Harwitt LISP in BASIC is a LISP interpreter for a Scheme-like dialect of LISP, which happens to have

### CSc 520 Principles of Programming Languages

CSc 520 Principles of Programming Languages 3: Scheme Introduction Christian Collberg collberg@cs.arizona.edu Department of Computer Science University of Arizona Copyright c 2005 Christian Collberg [1]

### Concepts of programming languages

Concepts of programming languages Lecture 7 Wouter Swierstra 1 Last time Relating evaluation and types How to handle variable binding in embedded languages? 2 DSLs: approaches A stand-alone DSL typically

### TUPLES AND RECURSIVE LISTS 5

TUPLES AND RECURSIVE LISTS 5 COMPUTER SCIENCE 61A July 3, 2012 1 Sequences From the Pig project, we discovered the utility of having structures that contain multiple values. Today, we are going to cover

### Principles of Programming Languages 2017W, Functional Programming

Principles of Programming Languages 2017W, Functional Programming Assignment 3: Lisp Machine (16 points) Lisp is a language based on the lambda calculus with strict execution semantics and dynamic typing.

### Environments

Environments PLAI Chapter 6 Evaluating using substitutions is very inefficient To work around this, we want to use a cache of substitutions. We begin evaluating with no cached substitutions, then collect

### Deferred operations. Continuations Structure and Interpretation of Computer Programs. Tail recursion in action.

Deferred operations Continuations 6.037 - Structure and Interpretation of Computer Programs Mike Phillips (define the-cons (cons 1 #f)) (set-cdr! the-cons the-cons) (define (run-in-circles l) (+

### Functional programming with Common Lisp

Functional programming with Common Lisp Dr. C. Constantinides Department of Computer Science and Software Engineering Concordia University Montreal, Canada August 11, 2016 1 / 81 Expressions and functions

### CS 314 Principles of Programming Languages

CS 314 Principles of Programming Languages Lecture 16: Functional Programming Zheng (Eddy Zhang Rutgers University April 2, 2018 Review: Computation Paradigms Functional: Composition of operations on data.

### CS 314 Principles of Programming Languages

CS 314 Principles of Programming Languages Lecture 17: Functional Programming Zheng (Eddy Zhang Rutgers University April 4, 2018 Class Information Homework 6 will be posted later today. All test cases

### Notes on Higher Order Programming in Scheme. by Alexander Stepanov

by Alexander Stepanov August 1986 INTRODUCTION Why Scheme? Because it allows us to deal with: 1. Data Abstraction - it allows us to implement ADT (abstact data types) in a very special way. The issue of

### COMPUTER SCIENCE IN THE NEWS. CS61A Lecture 21 Scheme TODAY REVIEW: DISPATCH DICTIONARIES DISPATCH DICTIONARIES 7/27/2012

COMPUTER SCIENCE IN THE NEWS CS6A Lecture 2 Scheme Jom Magrotker UC Berkeley EECS July 24, 202 http://spectrum.ieee.org/tech talk/robotics/artificial intelligence/a texas hold em tournament for ais 2 TODAY

### CSE341 Autumn 2017, Final Examination December 12, 2017

CSE341 Autumn 2017, Final Examination December 12, 2017 Please do not turn the page until 2:30. Rules: The exam is closed-book, closed-note, etc. except for both sides of one 8.5x11in piece of paper. Please

### Building up a language SICP Variations on a Scheme. Meval. The Core Evaluator. Eval. Apply. 2. syntax procedures. 1.

6.001 SICP Variations on a Scheme Scheme Evaluator A Grand Tour Techniques for language design: Interpretation: eval/appl Semantics vs. snta Sntactic transformations Building up a language... 3. 1. eval/appl