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

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

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

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

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

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

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 The Scheme Interpreter. 2 Primitives COMPUTER SCIENCE 61A. October 29th, 2012

SCHEME AND CALCULATOR 5b

CS 61A Discussion 8: Scheme. March 23, 2017

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

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

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

Functional Programming. Pure Functional Languages

Functional Programming. Pure Functional Languages

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

An introduction to Scheme

Documentation for LISP in BASIC

Lisp. Versions of LISP

11/6/17. Functional programming. FP Foundations, Scheme (2) LISP Data Types. LISP Data Types. LISP Data Types. Scheme. LISP: John McCarthy 1958 MIT

Scheme Tutorial. Introduction. The Structure of Scheme Programs. Syntax

Functional Programming

Macros & Streams Spring 2018 Discussion 9: April 11, Macros

Functional Programming. Pure Functional Programming

Functional Programming - 2. Higher Order Functions

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

Introduction to Scheme

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

Lecture #24: Programming Languages and Programs

TAIL RECURSION, SCOPE, AND PROJECT 4 11

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

Scheme in Scheme: The Metacircular Evaluator Eval and Apply

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

Chapter 15 Functional Programming Languages

CS450 - Structure of Higher Level Languages

INTERPRETERS AND TAIL CALLS 9

Principles of Programming Languages 2017W, Functional Programming

Functional programming with Common Lisp

CS 314 Principles of Programming Languages

Homework 1. Reading. Problems. Handout 3 CSCI 334: Spring, 2012

A Brief Introduction to Scheme (II)

Programming Languages

Modern Programming Languages. Lecture LISP Programming Language An Introduction

University of Massachusetts Lowell

Scheme: Data. CS F331 Programming Languages CSCE A331 Programming Language Concepts Lecture Slides Monday, April 3, Glenn G.

6.001: Structure and Interpretation of Computer Programs

Organization of Programming Languages CS3200/5200N. Lecture 11

CS61A Midterm 2 Review (v1.1)

LECTURE 16. Functional Programming

Project 2: Scheme Interpreter

Homework 1. Notes. What To Turn In. Unix Accounts. Reading. Handout 3 CSCI 334: Spring, 2017

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

Programming Languages

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

ITERATORS AND STREAMS 9

FP Foundations, Scheme

Chapter 1. Fundamentals of Higher Order Programming

UNIVERSITY of CALIFORNIA at Berkeley Department of Electrical Engineering and Computer Sciences Computer Sciences Division


CSCC24 Functional Programming Scheme Part 2

Notes on Higher Order Programming in Scheme. by Alexander Stepanov

CSE 341 Section Handout #6 Cheat Sheet

(Func&onal (Programming (in (Scheme)))) Jianguo Lu

;; definition of function, fun, that adds 7 to the input (define fun (lambda (x) (+ x 7)))

CS 360 Programming Languages Interpreters

Structure and Interpretation of Computer Programs

STREAMS 10. Basics of Streams. Practice with Streams COMPUTER SCIENCE 61AS. 1. What is a stream? 2. How does memoization work?

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?

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

April 2 to April 4, 2018

CS 275 Name Final Exam Solutions December 16, 2016

User-defined Functions. Conditional Expressions in Scheme

Scheme as implemented by Racket

61A LECTURE 18 SCHEME. Steven Tang and Eric Tzeng July 24, 2013

CSC 533: Programming Languages. Spring 2015

by the evening of Tuesday, Feb 6

Common LISP-Introduction

MetacircularScheme! (a variant of lisp)

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

Programming Languages. Thunks, Laziness, Streams, Memoization. Adapted from Dan Grossman s PL class, U. of Washington

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

Chapter 15. Functional Programming Languages

An Explicit Continuation Evaluator for Scheme

Scheme: Strings Scheme: I/O

Discussion 4. Data Abstraction and Sequences

CS 314 Principles of Programming Languages. Lecture 16

Project 1: Scheme Pretty-Printer

Structure and Interpretation of Computer Programs

More About Recursive Data Types

Streams and Evalutation Strategies

6.001 Notes: Section 8.1

Functional abstraction. What is abstraction? Eating apples. Readings: HtDP, sections Language level: Intermediate Student With Lambda

Functional abstraction

Using Symbols in Expressions (1) evaluate sub-expressions... Number. ( ) machine code to add

CS 314 Principles of Programming Languages

CPS 506 Comparative Programming Languages. Programming Language Paradigm

CSc 520 Principles of Programming Languages

Midterm Examination (Sample Solutions), Cmput 325

regsim.scm ~/umb/cs450/ch5.base/ 1 11/11/13

A First Look at ML. Chapter Five Modern Programming Languages, 2nd ed. 1

A LISP Interpreter in ML

Transcription:

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 Scheme programs, we will eventually write a Scheme interpreter in Project 4! Scheme is a dialect of the Lisp programming language, a language dating back to 958. The popularity of Scheme within the programming language community stems from its simplicity in fact, previous versions of CS 6A were taught in the Scheme language. 2 Primitives Scheme has a set of atomic primitive expressions. Atomic means that these expressions cannot be divided up. scm> 2 2 scm> 2.2 2.2 scm> #t True scm> #f False Unlike in Python, the only primitive in Scheme that is a false value is #f and its equivalents, false and False. The define special form defines variables and procedures by binding a value to a variable, just like the assignment statement in Python. When a variable is defined, the define special form returns a symbol of its name. A procedure is what we call a function in Scheme! The syntax to define a variable and procedure are: (define <variable name> <value> (define (<function name> <parameters> <function body>

2 Scheme Questions 2. What would Scheme display? scm> (define a a scm> a scm> (define b a b scm> b scm> (define c 'a c scm> c a Call Expressions To call a function in Scheme, you first need a set of parentheses. Inside the parentheses, you specify an operator expression, then zero or more oprand subexpressions (remember the spaces!. Operators may be symbols, such as + and * or more complex expressions, as long as they evaluate to procedure values. scm> (- ; - 0 scm> (/ 8 4 2 ; 8 / 4 / 2 scm> (* (+ 2 (+ 2 ; ( + 2 * ( + 2 9 Evaluating a Scheme function call works just like Python:

Scheme. Evaluate the operator (the first expression after the (, then evaluate each of the operands. 2. Apply the operator to those evaluated operands. When you evaluate (+ 2, you evaluate the + symbol, which is bound to a built-in addition function. Then, you evaluate and 2, which are primitives. Finally, you apply the addition function to and 2. Questions. What would Scheme display? scm> (+ scm> (* scm> (+ (* (* 4 4 25 scm> (define a (define b a scm> a b scm> b 4 Special Forms There are certain expressions that look like function calls, but don t follow the rule for order of evaluation. These are called special forms. You ve already seen one define, where the first argument, the variable name, doesn t actually get evaluated to a value.

4 Scheme 4. If Expression Another common special form is the if form. An if expression looks like: (if <condition> <then> <else> where <condition>, <then> and <else> are expressions. First, <condition> is evaluated. If it evaluates to #t, then <then> is evaluated. Otherwise, <else> is evaluated. Remember that only #f is a false-y value (also False for our interpreter; everything else is truth-y. scm> (if (< 4 5 2 scm> (if #f (/ 0 42 42

Scheme 5 4.2 Boolean Operators Much like Python, Scheme also has the boolean operators and, or, and not. In addition, and and or are also special forms because they are short-circuiting operators. scm> (and 25 2 2 scm> (or 2 Questions 4. What would Scheme display? scm> (if (or #t (/ 0 (/ 0 scm> (if (> 4 (+ 2 4 (+ 4 (* 2 0 scm> ((if (< 4 + - 4 00-96 scm> (if 0 2 4. Lambdas and Defining Functions Scheme has lambdas too! The syntax is (lambda (<PARAMETERS> <EXPR> Like in Python, lambdas are function values. Also like in Python, when a lambda expression is called in Scheme, a new frame is created where the parameters are bound to the arguments passed in. Then, <EXPR> is evaluated in this new frame. Note that <EXPR> is not evaluated until the lambda function is called. Like in Python, lambda functions are also values! functions: So you can do this to define scm> (define (square x (* x x ; Create function square using define special form square scm> (define square (lambda (x (* x x ; Equivalently, bind the name square to a lambda function square scm> (square 4 6

6 Scheme let is another special form based around lambda. The structure of let is as follows: (let ( (<SYMBOL> <EXPR>... (<SYMBOLN> <EXPRN> <BODY> This binds the results of evaluating expressions through n to their associated symbols, creating temporary variables. Finally, the body of the let is evaluated. This special form is really just equivalent to: ( (lambda (<SYMBOL>... <SYMBOLN> <BODY> <EXPR>... <EXPRN> Think of the temporary variables as being the parameters of a lambda function. Then, the arguments are the values of the expressions, which we bind to the temporary variables by calling the lambda. Consider the following example: (let ((x (y 2 (+ x y This is equivalent to: ((lambda (x y (+ x y 2 Questions 4. Write a function that calculates the factorial of a number. (define (factorial x (if (< x 2 (* x (factorial (- x 4.2 Write a function that calculates the n th Fibonacci number. (define (fib n (if (< n 2 (+ (fib (- n (fib (- n 2

Scheme 7 5 Pairs and Lists To construct a (linked list in Scheme, you can use the constructor cons (which takes two arguments. nil represents the empty list. If you have a linked list in Scheme, you can use selector car to get the first element and selector cdr to get the rest of the list. (car and cdr don t stand for anything anymore, but if you want the history go to http://en.wikipedia.org/wiki/car and CDR. scm> nil ( scm> (null? nil #t scm> (cons 2 nil (2 scm> (cons (cons 2 nil ( 2 scm> (define a (cons (cons 2 nil a scm> (car a scm> (cdr a (2 scm> (car (cdr a 2 scm> (define (len a (if (null? a 0 (+ (len (cdr a len scm> (len a 2 If a list is a good looking list, like the ones above where the second element is always a linked list, we call it a well-formed list. Interestingly, in Scheme, the second element does not have to be a linked list. You can supply something else instead, creating a malformed list. The difference is shown with a dot: scm> (cons 2 (2. scm> (cons 2 (cons nil (2 scm> (cdr (cons 2 scm> (cdr (cons 2 (cons nil ( In general, the rule for displaying a pair is as follows: use the dot to separate the car and cdr fields of a pair, but if the dot is immediately followed by an open

8 Scheme parenthesis, then remove the dot and the parenthesis pair. Thus, (0. (. 2 becomes (0. 2 There are many useful operations and shorthands on lists. list takes zero or more arguments and returns a list of its arguments. This typically behaves much like quoting a list, except that quoting will not evaluate the list you have quoted which can result in some different outcomes. scm> (list 2 ( 2 scm> '( 2 ( 2 scm> (car '( 2 scm> (equal? '( 2 (list 2 #t scm> '(. (2 ( 2 scm> '(define (square x (* x x (define (square x (* x x scm> square ; We didn't actually define square above because of the quote Error scm> (list (cons 2 ((. 2 scm> '((cons 2 ((cons 2 =, eq?, equal? = can only be used for comparing numbers. eq? behaves like == in Python for comparing two non-pairs (numbers, booleans, etc.. Otherwise, eq? behaves like is in Python. equal? compares pairs by determining if their cars are equal? and their cdrs are equal?(that is, they have the same contents. Otherwise, equal? behaves like eq?. scm> (define a '( 2 a scm> (= a a Error scm> (equal? a '( 2 #t scm> (eq? a '( 2 #f scm> (define b a b scm> (eq? a b #t

Scheme 9 Questions 5. Define concat, which takes two lists and concatenates them. Notice that simply calling (cons a b would not work because it will create a deep list. (define (concat a b (if (null? a b (cons (car a (concat (cdr a b scm> (concat '( 2 '(2 4 ( 2 2 4 5.2 Define replicate, which takes an element x and a non-negative integer n, and returns a list with x repeated n times. (define (replicate x n (if (= n 0 nil (cons x (replicate x (- n scm> (replicate 5 (5 5 5

0 Scheme 5. A run-length encoding is a method of compressing a sequence of letters. The list (a a a b a a a a can be compressed to ((a (b (a 4, where the compressed version of the sequence keeps track of how many letters appear consecutively. Write a Scheme function that takes a compressed sequence and expands it into the original sequence. Hint: You may want to use concat and replicate. (define (uncompress s (if (null? s s (concat (replicate (car (car s (car (cdr (car s (uncompress (cdr s scm> (uncompress '((a (b 2 (c (a b b c c c 5.4 Define map, which takes a procedure and applies it to every element in a given list. (define (map fn lst (if (null? lst nil (cons (fn (car lst (map fn (cdr lst scm> (map (lambda (x (* x x '( 2 ( 4 9 5.5 Define deep-map, which takes a procedure and applies to every element in a given nested list. The result should be a nested list with the same structure as the input list, but with each element replaced by the result of applying the procedure to that element. Use the built-in list? procedure to detect whether a value is a list. (define (deep-map fn lst (cond ((null? lst lst ((list? (car lst (cons (deep-map fn (car lst (deep-map fn (cdr lst (else (cons (fn (car lst (deep-map fn (cdr lst scm> (deep-map (lambda (x (* x x '( 2 ( 4 9 scm> (deep-map (lambda (x (* x x '( ((4 5 9 ( ((6 25 8

Scheme 6 Extra Questions 6. Fill in the following to complete an abstract tree data type: (define (make-tree label branches (cons label branches (define (label tree (define (branches tree (define (label tree (car tree (define (branches tree (cdr tree 6.2 Using the abstract data type above, write a function that sums up the entries of a tree, assuming that the entries are all numbers. Hint: you may want to use the map function you defined above, as well as an additional helper function. (define (tree-sum tree (+ (label tree (sum (map tree-sum (branches tree (define (sum lst (if (null? lst 0 (+ (car lst (sum (cdr lst 6. Using the abstract data type above, write a Scheme function that creates a new tree where the entries are the product of the entries along the path to the root in the original tree. Hint: you may want to write helper functions. 0 8 2 0 24 6 0 2 0 0 8 (define (path-product-tree t (define (path-product t product (let ((prod (* product (label t (make-tree prod (map (lambda (t (path-product t prod (branches tree (path-product t