Racket Values. cons Glues Two Values into a Pair. The Pros of cons: Programming with Pairs and Lists. Box-and-pointer diagrams for cons trees

Similar documents
Racket Values. cons Glues Two Values into a Pair. The Pros of cons: Pairs and Lists in Racket. Box-and-pointer diagrams for cons trees

Recursive List Func.ons in Racket

Func+on applica+ons (calls, invoca+ons)

CS251 Programming Languages Spring 2016, Lyn Turbak Department of Computer Science Wellesley College

LISP: LISt Processing

Lists in Lisp and Scheme

Func%onal Programming in Scheme and Lisp

Func%onal Programming in Scheme and Lisp

Introduction to Scheme

Overview. Factorial Revisited. Iteration via Tail Recursion in Racket. An itera*ve approach to factorial. What is itera*on?

Overview. Iteration via Tail Recursion in Racket. Factorial Revisited. An itera*ve approach to factorial. What is itera*on?

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

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

Ways to implement a language

Discussion 4. Data Abstraction and Sequences

Overview. Iteration via Tail Recursion in Racket SOLUTIONS. Factorial Revisited. An itera*ve approach to factorial

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

Scheme Quick Reference

Scheme Quick Reference

Functional Programming. Pure Functional Programming

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

6.034 Artificial Intelligence February 9, 2007 Recitation # 1. (b) Draw the tree structure corresponding to the following list.

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

CS251 Programming Languages Spring 2016, Lyn Turbak Department of Computer Science Wellesley College

PostFix. PostFix command semanccs (except exec) PostFix Syntax. A PostFix Interpreter in Racket. CS251 Programming Languages Fall 2017, Lyn Turbak

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

A Brief Introduction to Scheme (II)

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

CS101: Fundamentals of Computer Programming. Dr. Tejada www-bcf.usc.edu/~stejada Week 1 Basic Elements of C++

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

PostFix. PostFix command semanccs (except exec) PostFix Syntax. A PostFix Interpreter in Racket. CS251 Programming Languages Spring 2018, Lyn Turbak

A Quick Introduction to Common Lisp

Project 2: Scheme Interpreter

YOUR NAME PLEASE: *** SOLUTIONS ***

CSC 533: Programming Languages. Spring 2015

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

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

CS61A Notes 02b Fake Plastic Trees. 2. (cons ((1 a) (2 o)) (3 g)) 3. (list ((1 a) (2 o)) (3 g)) 4. (append ((1 a) (2 o)) (3 g))

Fall 2017 December 4, 2017

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

Fall 2017 December 4, Scheme. Instructions

6.001 recitation 3/21/07

Local defini1ons. Func1on mul1ples- of

Overview. CS301 Session 3. Problem set 1. Thinking recursively

Essentials of Programming Languages Language

Essentials of Programming Languages Language

CSc 520 Principles of Programming Languages

Notes on Higher Order Programming in Scheme. by Alexander Stepanov

University of Massachusetts Lowell

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

CS 314 Principles of Programming Languages. Lecture 16

CS 314 Principles of Programming Languages

CS61A Notes Week 9: Muta4on (solu4ons) Revenge of the Box- and- pointers

Scheme: Strings Scheme: I/O

Valex: Mul*ple Value Types, Condi*onals, Dynamic Type Checking and Desugaring SOLUTIONS

Laboratory: Recursion Basics

User-defined Functions. Conditional Expressions in Scheme

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

LECTURE 16. Functional Programming

Racket. CSE341: Programming Languages Lecture 14 Introduction to Racket. Getting started. Racket vs. Scheme. Example.

Floa.ng Point : Introduc;on to Computer Systems 4 th Lecture, Sep. 10, Instructors: Randal E. Bryant and David R.

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

Simplifying Logical Formulas

Valex: Mul*ple Value Types, Condi*onals, Dynamic Type Checking and Desugaring

CSE 413 Midterm, May 6, 2011 Sample Solution Page 1 of 8

Building a system for symbolic differentiation

Introduc)on To Standard ML

Sample midterm 1 #1. Problem 1 (What will Scheme print?).

ALISP interpreter in Awk

Principles of Programming Languages

CSE413 Midterm. Question Max Points Total 100

PAIRS AND LISTS 6. GEORGE WANG Department of Electrical Engineering and Computer Sciences University of California, Berkeley

How to Design Programs Languages

CS 61A, Fall, 2002, Midterm #2, L. Rowe. 1. (10 points, 1 point each part) Consider the following five box-and-arrow diagrams.

Functional Programming

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

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

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

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

An Explicit-Continuation Metacircular Evaluator

Building a system for symbolic differentiation

CS251 Programming Languages Handout # 47 Prof. Lyn Turbak May 22, 2005 Wellesley College. Scheme

CS 360 Programming Languages Interpreters

Roadmap. The Interface CSE351 Winter Frac3onal Binary Numbers. Today s Topics. Floa3ng- Point Numbers. What is ?

CS 342 Lecture 6 Scheme Procedures and Closures By: Hridesh Rajan

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

Introduc)on to C++ CS 16: Solving Problems with Computers I Lecture #2

Vectors in Scheme. Data Structures in Scheme

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

Symbolic Programming. Dr. Zoran Duric () Symbolic Programming 1/ 89 August 28, / 89

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

Wellesley College CS251 Programming Languages Spring, 2000 FINAL EXAM REVIEW PROBLEM SOLUTIONS

Programming Languages

An Introduction to Scheme

Streams. CS21b: Structure and Interpretation of Computer Programs Spring Term, 2004

Structure and Interpretation of Computer Programs

Syntactic Sugar: Using the Metacircular Evaluator to Implement the Language You Want

Homework 6: Higher-Order Procedures Due: 11:59 PM, Oct 16, 2018

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

2/18/14. Uses for Discrete Math in Computer Science. What is discrete? Why Study Discrete Math? Sets and Functions (Rosen, Sections 2.1,2.2, 2.

Transcription:

The Pros of cons: Programming with CS251 Programming Languages Fall 2017, Lyn Turbak Department of Computer Science Wellesley College booleans: #t, #f numbers: integers: 42, 0, -273 ra3onals: 2/3, -251/17 floa3ng point (including scien3fic nota3on): 98.6, -6.125, 3.141592653589793, 6.023e23 complex: 3+2i, 17-23i, 4.5-1.4142i Note: some are exact, the rest are inexact. See docs. strings: "cat", "CS251", "αβγ", "To be\nor not\nto be" characters: #\a, #\A, #\5, #\space, #\tab, #\newline anonymous func3ons: (lambda (a b) (+ a (* b c))) What about compound data? Racket Values 2 cons Glues Two Values into a Pair A new kind of value: pairs (a.k.a. cons cells): (cons V1 V2) e.g., - (cons 17 42) - (cons 3.14159 #t) In Racket, type Command-\ to get λ char - (cons "CS251" (λ (x) (* 2 x)) - (cons (cons 3 4.5) (cons #f #\a)) Can glue any number of values into a cons tree! Box-and-pointer diagrams for cons trees (cons v1 v2) v1 v2 Conven3on: put small values (numbers, booleans, characters) inside a box, and draw a pointers to large values (func3ons, strings, pairs) outside a box. (cons (cons 17 (cons "cat" #\a)) (cons #t (λ (x) (* 2 x)))) 17 #\a #t (λ (x) (* 2 x)) 3 "cat" 4

Big step seman,cs: Evalua3on Rules for cons E1 V1 E2 V2 (cons E1 E2) (cons V1 V2) [cons] Small-step seman,cs: cons has no special evalua3on rules. Its two operands are evaluated le\-to-right un3l a value (cons V1 V2) is reached: cons evalua3on example (cons (cons {(+ 1 2)} (< 3 4)) (cons (> 5 6) (* 7 8))) (cons (cons 3 {(< 3 4)}) (cons (> 5 6) (* 7 8))) (cons (cons 3 #t) (cons {(> 5 6)} (* 7 8))) (cons (cons 3 #t) (cons #f {(* 7 8)})) (cons (cons 3 #t) (cons #f 56)) (cons E1 E2) * (cons V1 {E2}); first evaluate E1 to V1 step-by-step * (cons V1 V2); then evaluate e2 to v2 step-by-step 5 6 car and cdr car extracts the le\ value of a pair Prac3ce with car and cdr Write expressions using car, cdr, and tr that extract the five leaves of this tree: (car (cons 7 4)) 7 (define tr (cons (cons 17 (cons "cat" #\a)) (cons #t (λ (x) (* 2 x)))) cdr extract the right value of a pair tr (cons (cons 17 (cons "cat" #\a)) (cons #t (λ (x) (* 2 x)))), (cdr (cons 7 4)) 4 tr Why these names? car from contents of address register cdr from contents of decrement register 17 #\a #t (λ (x) (* 2 x)) 7 "cat" 8

cadr and friends (caar e) means (car (car e)) (cadr e) means (car (cdr e)) (cdar e) means (cdr (car e)) (cddr e) means (cdr (cdr e)) (caaar e) means (car (car (car e))) (cddddr e) means (cdr (cdr (cdr (cdr e)))) Evalua3on Rules for car and cdr Big-step seman,cs: E (cons V1 V2) E (cons V1 V2) [car] (car E) V1 (cdr e) v2 Small-step seman,cs: (car (cons V1 V2)) V1 [car] (cdr (cons V1 V2)) V2 [cdr] [cdr] 9 10 Seman3cs Puzzle According to the rules on the previous page, what is the result of evalua3ng this expression? (car (cons (+ 2 3) (* 5 #t))) Note: there are two ``natural answers. Racket gives one, but there are languages that give the other one! Printed Representa3ons in Racket Interpreter > (lambda (x) (* x 2)) #<procedure> > (cons (+ 1 2) (* 3 4)) '(3. 12) > (cons (cons 5 6) (cons 7 8)) '((5. 6) 7. 8) > (cons 1 (cons 2 (cons 3 4))) '(1 2 3. 4) What s going on here? 11 12

Display Nota3on and Doged Pairs The display nota,on for (cons V1 V2) is (DN1. DN2), where DN1 and DN2 are the display nota3ons for V1 and V2 In display nota3on, a dot eats a paren pair that follows it directly: ((5. 6). (7. 8)) becomes ((5. 6) 7. 8) (1. (2. (3. 4))) becomes (1. (2 3. 4)) becomes (1 2 3. 4) Why? Because we ll see this makes lists print predly. The Racket interpreter puts a single quote mark before the display nota3on of a top-level pair value. (We ll say more about quota3on later.) display vs. print in Racket > (display (cons 1 (cons 2 null))) (1 2) > (display (cons (cons 5 6) (cons 7 8))) ((5. 6) 7. 8) > (display (cons 1 (cons 2 (cons 3 4)))) (1 2 3. 4) > (print(cons 1 (cons 2 null))) '(1 2) > (print(cons (cons 5 6) (cons 7 8))) '((5. 6) 7. 8) > (print(cons 1 (cons 2 (cons 3 4)))) '(1 2 3. 4) 13 14 Func3ons Can Take and Return Pairs (define (swap-pair pair) (cons (cdr pair) (car pair))) (define (sort-pair pair) (if (< (car pair) (cdr pair)) pair (swap pair))) What are the values of these expressions? (swap-pair (cons 1 2)) (sort-pair (cons 4 7)) Lists In Racket, a list is just a recursive pattern of pairs. A list is either The empty list null, whose display notation is () A nonempty list (cons Vfirst Vrest) whose - first element is Vfirst - and the rest of whose elements are the sublist Vrest E.g., a list of the 3 numbers 7, 2, 4 is wrigen (sort-pair (cons 8 5)) (cons 7 (cons 2 (cons 4 null))) 15 16

Box-and-pointer nota3on for lists A list of n values is drawn like this: V1 V2 Vn For example: 7 2 4 Vn Nota3on for null in box-and-pointer diagrams A pair slot containing null can also be with a slash through the slot list sugar Treat list as syntac3c sugar: (list)desugars to null (list E1 )desugars to (cons E1 (list )) For example: (list (+ 1 2) (* 3 4) (< 5 6)) desugars to (cons (+ 1 2) (list (* 3 4) (< 5 6))) desugars to (cons (+ 1 2) (cons (* 3 4) (list (< 5 6)))) desugars to (cons (+ 1 2) (cons (* 3 4) (cons (< 5 6) (list)))) desugars to (cons (+ 1 2) (cons (* 3 4) (cons (< 5 6) null))) 7 2 4 17 * This is a white lie, but we can pretend it s true for now 18 Display Nota3on for Lists The dot eats parens rule makes lists display nicely: (list 7 2 4) desugars to (cons 7 (cons 2 (cons 4 null)))) displays as (before rule) (7. (2. (4. ()))) displays as (a\er rule) (7 2 4) prints as '(7 2 4) In Racket: > (display (list 7 2 4)) (7 2 4) > (display (cons 7 (cons 2 (cons 4 null)))) (7 2 4) 19 list and small-step evalua3on It is some3mes helpful to both desugar and resugar with list: (list (+ 1 2) (* 3 4) (< 5 6)) desugars to (cons {(+ 1 2)} (cons (* 3 4) (cons (< 5 6) null))) (cons 3 (cons {(* 3 4)} (cons (< 5 6) null))) (cons 3 (cons 12 (cons {(< 5 6)} null))) (cons 3 (cons 12 (cons #t null))) resugars to (list 3 12 #t) Heck, let s just informally write this as: (list {(+ 1 2)} (* 3 4) (< 5 6)) (list 3 {(* 3 4)} (< 5 6)) (list 3 12 {(< 5 6)}) (list 3 12 #t) 20

first, rest, and friends first returns the first element of a list: (first (list 7 2 4)) 7 (first is almost a synonym for car, but requires its argument to be a list) rest returns the sublist of a list containing every element but the first: (rest (list 7 2 4)) (list 2 4) (rest is almost a synonym for cdr, but requires its argument to be a list) Also have second, third,, ninth, tenth Recursive List Func3ons Because lists are defined recursively, it s natural to process them recursively. Typically (but not always) a recursive func3on recf on a list argument L has two cases: base case: what does recf return when L is empty? (Use null? to test for an empty list) recursive case: if L is the nonempty list (cons Vfirst Vrest) how are Vfirst and (recf Vrest)combined to give the result for(recf L)? Note that we always ``blindly apply recf to Vrest! 21 22 Recursive List Func3ons: Divide/Conquer/Glue (DCG) strategy for the general case [in words] Recursive List Func3ons: Divide/Conquer/Glue (DCG) strategy for the general case [in diagram] Step 1 (concrete example): pick a concrete input list, typically 3 or 4 elements long. What should the func3on return on this input? (sum '( 5 7 2 4 )) * 18 E.g. A sum func3on that returns the sum of all the numbers in a list: (sum '(5 7 2 4)) * 18 Step 2 (divide): without even thinking, always apply the func3on to the rest of the list. What does it return? (sum '(7 2 4)) * 13 Step 3 (glue): How to combine the first element of the list (in this case, 5) with the result from processing the rest (in this case, 13) to give the result for processing the whole list (in this case, 18)? 5 + (sum '(7 2 4)) * 18 Step 4 (generalize): Express the general case in terms of an arbitrary input: (define (sum nums) (+ (first nums) (sum (rest nums)) ) (sum '(7 2 4)) * 13 combine Divide: what should func3on return for rest of list? (wishful thinking!) Glue: how to combine the first element of the list with the result of recursively processing rest of the list to get the desired result for the whole list? Solu3on for concrete example: 5 + (sum '(7 2 4)) Generaliza3on of concrete solu3on: (first nums) + (sum (rest nums)) 23 24

Recursive List Func3ons: base case via singleton case Deciding what a recursive list func3on should return for the empty list is not always obvious and can be tricky. E.g. what should (sum '()) return? If the answer isn t obvious, consider the ``penul3mate case in the recursion, which involves a list of one element: (sum '( 4 )) * 4 Divide: what value Vnull should func3on return for empty list? (sum '()) * Vnull Pudng it all together: base & general cases (sum nums) returns the sum of the numbers in the list nums (define (sum ns) (if (null? ns) 0 (+ (first ns) (sum (rest ns))))) + In this case, Vnull should be 0, which is the iden3ty element for addi3on. But in general it depends on the details of the par3cular combiner determined from the general case. So solve the general case before the base case! 25 26 Understanding sum: Approach #1 (sum '(7 2 4)) Understanding sum: Approach #2 In (sum (list 7 2 4)), the list argument to sum is 7 2 4 + 0 (cons 7 (cons 2 (cons 4 null)))) Replace cons by + and null by 0 and simplify: (+ 7 (+ 2 (+ 4 0)))) + 4 (+ 7 (+ 2 4))) + 6 (+ 7 6) 13 13 We ll call this the recursive accumula,on pagern 5-27 28

Generalizing sum: Approach #1 (recf (list 7 2 4)) Generalizing sum: Approach #2 In (recf (list 7 2 4)), the list argument to recf is 7 2 4 nullval (cons 7 (cons 2 (cons 4 null)))) Replace cons by combine and null by nullval and simplify: combine (combine 7 (combine 2 (combine 4 nullval )))) combine combine 29 30 Generalizing the sum defini3on (define (recf ns) (if (null? ns) nullval (combine (first ns) (recf (rest ns))))) Your turn Define the following recursive list func3ons and test them in Racket: (product ns) returns the product of the numbers in ns (min-list ns) returns the minimum of the numbers in ns Hint: use min and +inf.0 (posi3ve infinity) (max-list ns) returns the minimum of the numbers in ns Hint: use max and -inf.0 (nega3ve infinity) (all-true? bs) returns #t if all the elements in bs are truthy; otherwise returns #f. Hint: use and (some-true? bs) returns a truthy value if at least one element in bs is truthy; otherwise returns #f. Hint: use or 31 (my-length xs) returns the length of the list xs 32

Recursive Accumula3on Pagern Summary combine nullval sum + 0 product * 1 min-list min +inf.0 max-list max -inf.0 all-true? and #t some-true? or #f my-length (λ (fst subres) (+ 1 subres)) 0 Mapping Example: map-double (map-double ns) returns a new list the same length as ns in which each element is the double of the corresponding element in ns. > (map-double (list 7 2 4)) '(14 4 8) (define (map-double ns) (if (null? ns) ; Flesh out base case ; Flesh out general case )) 33 34 Understanding map-double (map-double '(7 2 4)) 7 2 4 Generalizing map-double (mapf (list V1 V2 Vn)) V1 V2 Vn * 2 * 2 * 2 14 4 8 F (F v1) F F (F v2) (F vn) We ll call this the mapping pagern 35 (define (mapf xs) (if (null? xs) null (cons (F (first xs)) (mapf (rest xs))))) 36

Expressing mapf as an accumula3on Some Recursive Lisxuns Need Extra Args (define (mapf xs) (if (null? xs) null ((λ (fst subres) ) ; Flesh this out (first xs) (mapf (rest xs))))) (define (map-scale factor ns) (if (null? ns) null (cons (* factor (first ns)) (map-scale factor (rest ns))))) 37 38 Filtering Example: filter-positive Understanding filter-positive (filter-positive ns) returns a new list that contains only the posi3ve elements in the list of numbers ns, in the same rela3ve order as in ns. > (filter-positive (list 7-2 -4 8 5)) '(7 8 5) (define (filter-positive ns) (if (null? ns) ; Flesh out base case ; Flesh out recursive case > 0 #t (filter-positive (list 7-2 -4 8 5)) 7-2 -4 8 5 > 0 > 0 > 0 > 0 #f #f #t #t 7 8 5 )) We ll call this the filtering pagern 39 40

Generalizing filter-positive (filterp (list V1 V2 Vn)) V1 V2 Vn P P P Expressing filterp as an accumula3on (define (filterp xs) (if (null? xs) null ((lambda (fst subres) #t #f #t V1 (define (filterp xs) (if (null? xs) null (if (P (first xs)) (cons (first xs) (filterp (rest xs))) (filterp (rest xs))))) Vn 41 ) ; Flesh this out (first xs) (filterp (rest xs))))) 42 Your turn: Define these using Divide/Conquer/Glue > (snoc 11 '(7 2 4)) '(7 2 4 11) > (my-append '(7 2 4) '(5 8)) '(7 2 4 5 8) > (append-all '((7 2 4) (9) () (5 8))) '(7 2 4 9 5 8) > (my-reverse '(5 7 2 4)) '(4 2 7 5) 43