CSC 533: Programming Languages. Spring 2015

Similar documents
Scheme Quick Reference

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

Functional Programming Languages (FPL)

Scheme Quick Reference

Functional Programming. Big Picture. Design of Programming Languages

CSE 341 Section Handout #6 Cheat Sheet

FP Foundations, Scheme

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

Functional Programming. Pure Functional Programming

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

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

Essentials of Programming Languages Language

Essentials of Programming Languages Language

Functional Programming. Pure Functional Languages

Organization of Programming Languages CS3200/5200N. Lecture 11

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

CS 314 Principles of Programming Languages

Functional Programming. Pure Functional Languages

Functional Languages. Hwansoo Han

How to Design Programs Languages

Chapter 15. Functional Programming Languages

Introduction to Scheme

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

CPS 506 Comparative Programming Languages. Programming Language Paradigm

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

Project 2: Scheme Interpreter

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

Functional Programming

Lecture Notes on Lisp A Brief Introduction

A Brief Introduction to Scheme (II)

Chapter 15 Functional Programming Languages

A Brief Introduction to Scheme (I)

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

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

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

Scheme: Expressions & Procedures

Programming Languages

CSc 520 Principles of Programming Languages

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

Scheme as implemented by Racket

LECTURE 16. Functional Programming

Notes on Higher Order Programming in Scheme. by Alexander Stepanov

Functional programming with Common Lisp

Modern Programming Languages. Lecture LISP Programming Language An Introduction

An Introduction to Scheme

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

User-defined Functions. Conditional Expressions in Scheme

CS 360 Programming Languages Interpreters

Principles of Programming Languages COMP251: Functional Programming in Scheme (and LISP)

COP4020 Programming Assignment 1 - Spring 2011

Fundamentals of Artificial Intelligence COMP221: Functional Programming in Scheme (and LISP)

Introduction to LISP. York University Department of Computer Science and Engineering. York University- CSE V.

CS 314 Principles of Programming Languages. Lecture 16

CS61A Midterm 2 Review (v1.1)

Functional Programming Languages (FPL)

An Explicit-Continuation Metacircular Evaluator

Lists in Lisp and Scheme

1 Lexical Considerations

Documentation for LISP in BASIC

Introductory Scheme. Revision 1

CSC 533: Organization of Programming Languages. Spring 2005

Imperative, OO and Functional Languages A C program is

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

Lexical Considerations

CSCC24 Functional Programming Scheme Part 2


CSCI337 Organisation of Programming Languages LISP

4/19/2018. Chapter 11 :: Functional Languages

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

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

Introduction to Functional Programming

Programming Languages. Function-Closure Idioms. Adapted from Dan Grossman's PL class, U. of Washington

CSc 520 Principles of Programming Languages

CS 314 Principles of Programming Languages

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

CSc 520. Principles of Programming Languages 7: Scheme List Processing

Lexical Considerations

NCCU 資訊碩專班 Advanced Programming Languages 高等程式語言 資科系陳恭副教授. Instructor: Spring Lecture 6: Functional Programming, Lisp, Scheme-1 修訂版

NOTE: Answer ANY FOUR of the following 6 sections:

;;; Determines if e is a primitive by looking it up in the primitive environment. ;;; Define indentation and output routines for the output for

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

Func%onal Programming in Scheme and Lisp

LISP. Everything in a computer is a string of binary digits, ones and zeros, which everyone calls bits.

CSc 520 Principles of Programming Languages. Examining Lists. Constructing Lists... 7: Scheme List Processing

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

Functional abstraction

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

Chapter 15. Functional Programming Languages

INTRODUCTION TO SCHEME

Imperative languages

Func%onal Programming in Scheme and Lisp

Administrivia. Simple data types

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

Common Lisp. Blake McBride

CS 480. Lisp J. Kosecka George Mason University. Lisp Slides

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 2. ÚVOD DO LISPU: ATOMY, SEZNAMY, FUNKCE,

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

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

Fifth Generation CS 4100 LISP. What do we need? Example LISP Program 11/13/13. Chapter 9: List Processing: LISP. Central Idea: Function Application

Transcription:

CSC 533: Programming Languages Spring 2015 Functional programming LISP & Scheme S-expressions: atoms, lists functional expressions, evaluation, define primitive functions: arithmetic, predicate, symbolic, equality, higher-order special forms: if, cond recursion: tail vs. full 1 Functional programming imperative languages are modeled on the von Neumann architecture in mid 50's, AI researchers (Newell, Shaw & Simon) noted that could define a language closer to human reasoning symbolic (dynamic) list-oriented transparent memory management in late 50's, McCarthy developed LISP (List Processing Language) instantly popular as the language for AI separation from the underlying architecture tended to make it less efficient (and usually interpreted) 2 1

LISP LISP is very simple and orthogonal only 2 kinds of data objects 1. atoms (identifiers, strings, numbers, ) 2. lists (of atoms and sublists) unlike arrays, lists do not have to store items of same type/size do not have to be stored contiguously do not have to provide random access all computation is performed by applying functions to arguments in pure LISP: no variables, no assignments, no iteration functions and function calls are also represented as lists no distinction between program and data 3 Scheme Scheme was developed at MIT in the mid 70's clean, simple subset of LISP static scoping first-class functions efficient tail-recursion function calls appear as lists: (FUNC ARG1 ARG2 ARGn) Ø (+ 3 2) 5 Ø (+ 3 (* 2 5)) 13 Ø (car '(foo bar biz baz)) foo Ø (cdr '(foo bar biz baz)) (bar biz baz) quote symbol denotes data - not evaluated by the interpreter - numbers are implicitly quoted car : returns first element of list cdr : returns rest of list 4 2

Scheme functions Scheme functions are also defined as lists (MORE DETAILS LATER) (define (FUNC ARG1 ARG2... ARGn) RETURN_EXPRESSION) (define (square x) (define (last arblist) (* x x)) (car (reverse arblist))) Ø (square 3) Ø (last '(a b c)) 9 c Ø (square 1.5) Ø (last '(foo)) 2.25 foo 5 Obtaining a Scheme interpreter many free Scheme interpreters/environments exist Dr. Scheme is an development environment developed at Rice University contains an integrated editor, syntax checker, debugger, interpreter Windows, Mac, and UNIX versions exist can download a personal copy from http://download.plt-scheme.org/drscheme/ ignore Racket propaganda, select older 4.2.4 version (4.2.5 crashes for me) be sure to set Language to "Pretty Big PLAY TIME! Details to follow 6 3

S-expressions in LISP/Scheme, data & programs are all of the same form: S-expressions (short for Symbolic-expressions) an S-expression is either an atom or a list atoms numbers 4 3.14 1/2 #xa2 #b1001 characters #\a #\Q #\space #\tab strings "foo" "Dave Reed" "@%!?#" Booleans #t #f symbols Dave num123 miles->km!_^_! symbols are sequences of letters, digits, and "extended alphabetic characters" + -. * / < > =!? : $ % + & ~ ^ can't start with a digit, case insensitive by default (but can set preferences in Dr. Scheme) 7 S-expressions (cont.) lists () is a list (L1 L2... Ln) is a list, where each Li is either an atom or a list for example: () (a) (a b c d) ((a b) c (d e)) (((((a))))) note the recursive definition of a list GET USED TO IT! also, get used to parentheses (LISP = Lots of Inane, Silly Parentheses) 8 4

Functional expressions computation in a functional language is via function calls (FUNC ARG1 ARG2... ARGn) (car '(a b c)) (+ 3 (* 4 2)) note: functional expressions are S-expressions evaluating a functional expression: function/operator name & arguments are evaluated in unspecified order note: if argument is a functional expression, evaluate recursively the resulting function is applied to the resulting values (car '(a b c)) evaluates to list (a b c) : ' terminates recursive evaluation evaluates to primitive function so, primitive car function is called with argument (a b c) 9 Arithmetic primitives predefined functions: + - * / quotient remainder modulo max min abs gcd lcm floor ceiling truncate round = < > <= >= many of these take a variable number of inputs (+ 3 6 8 4) à 21 (max 3 6 8 4) à 8 (= 1 (-3 2) (* 1 1)) à #t (< 1 2 3 4) à #t functions that return a true/false value are called predicate functions zero? positive? negative? odd? even? (odd? 5) à #t (positive? (- 4 5)) à #f 10 5

Data types in LISP/Scheme similar to JavaScript, LISP/Scheme is dynamically typed types are associated with values rather than variables, bound dynamically numbers can be described as a hierarchy of types number complex real MORE GENERAL rational integer integers and rationals are exact values, others can be inexact arithmetic operators preserve exactness, can explicitly convert (+ 3 1/2) à 7/2 (+ 3 0.5) à 3.5 (inexact->exact 4.5) à 9/2 (exact->inexact 9/2) à 4.5 11 Symbolic primitives predefined functions: car cdr cons list list-ref length member reverse append (list 'a 'b 'c) à (a b c) (list-ref '(a b c) 1) à b (member 'b '(a b c)) à (b c) (member 'd '(a b c)) à #f car and cdr can be combined for brevity (cadr '(a b c)) (car (cdr '(a b c))) à b cadr returns 2 nd item in list caddr returns 3 rd item in list cadddr returns 4 th item in list (can only go 4 levels deep) 12 6

Equality primitives equal? compares 2 inputs, returns #t if equivalent, else #f (equal? 'a 'a) à #t (equal? '(a b) '(a b)) à #t (equal? (cons 'a '(b)) '(a b)) à #t other (more restrictive) equivalence functions exist eq? compares 2 symbols (efficient, simply compares pointers) eqv? compares 2 atomics (symbols, numbers, chars, strings, bools) -- less efficient, strings & numbers can't be compared in constant time (eq? 'a 'a) à #t (eqv? 'a 'a) à #t (eq? '(a b) '(a b)) à #f (eqv? '(a b) '(a b)) à #f (eq? 2 2) à unspecified (eqv? 2 2) à #t equal? uses eqv?, applied recursively to lists 13 Defining functions can define a new function using define a function is a mapping from some number of inputs to a single output (define (NAME IN1 IN2 INn) OUTPUT_VALUE) (define (square x) (define (next-to-last arblist) (* x x)) (cadr (reverse arblist))) basically, parameter passing is by-value since each argument is evaluated before calling the function but no copying (instead, structure sharing) 14 7

Conditional evaluation can select alternative expressions to evaluate (if TEST TRUE_EXPRESSION FALSE_EXPRESSION) (define (my-abs num) (if (negative? num) (- 0 num) num)) (define (singleton? arblist) (if (and (list? arblist) (= (length arblist) 1)) #t #f)) and, or, not are standard boolean connectives evaluated from left-to-right, short-circuit evaluation 15 Conditional evaluation (cont.) predicates exist for selecting various types symbol? char? boolean? string? list? null? number? complex? real? rational? integer? exact? inexact? note: an if-expression is a special form is not considered a functional expression, doesn t follow standard evaluation rules (if (list? x) (car x) (list x)) test expression is evaluated if value is anything but #f, first expression is evaluated & returned if value is #f, second expression is evaluated & returned anything but #f is considered "true" (if (member 'foo '(biz foo foo bar)) 'yes 'no) 16 8

Multi-way conditional when there are more than two alternatives, can nest if-expressions (i.e., cascading if's) use the cond special form (i.e., a switch) (cond (TEST1 EXPRESSION1) (TEST2 EXPRESSION2)... (else EXPRESSIONn)) evaluate tests in order when reach one that evaluates to "true", evaluate corresponding expression & return (define (compare num1 num2) (define (my-member item lst) (cond ((= num1 num2) 'equal) (cond ((null? lst) #f) ((> num1 num2) 'greater) ((equal? item (car lst)) lst) (else 'less))) (else (my-member item (cdr lst))))) 17 Repetition via recursion pure LISP/Scheme does not have loops repetition is performed via recursive functions (define (sum-up-to N) (if (< N 1) 0 (+ N (sum-up-to (- N 1))))) (define (my-member item lst) (cond ((null? lst) #f) ((equal? item (car lst)) lst) (else (my-member item (cdr lst))))) (define (my-length lst) IN-CLASS EXERCISE ) 18 9

Tail-recursion vs. full-recursion a tail-recursive function is one in which the recursive call occurs last (define (my-member item lst) (cond ((null? lst) #f) ((equal? item (car lst)) lst) (else (my-member item (cdr lst))))) a full-recursive function is one in which further evaluation is required (define (sum-up-to N) (if (< N 1) 0 (+ N (sum-up-to (- N 1))))) each full-recursive call requires a new activation record on the run-time stack with tail-recursion, don't need to retain current activation record when make call can discard the current activation record, push record for new recursive call thus, no limit on recursion depth (each recursive call reuses the same memory) Scheme interpreters are required to perform this tail-recursion optimization 19 Tail-recursion vs. full-recursion (cont.) any full-recursive function can be rewritten using tail-recursion often accomplished using a help function with an accumulator (define (factorial N) (if (zero? N) 1 (* N (factorial (- N 1))))) value is computed "on the way up" (factorial 2) (* 2 (factorial 1)) (* 1 (factorial 0)) 1 (define (factorial N) (factorial-help N 1)) (define (factorial-help N value-so-far) (if (zero? N) value-so-far (factorial-help (- N 1) (* N value-so-far))))) value is computed "on the way down" (factorial-help 2 1) (factorial-help 1 (* 2 1)) (factorial-help 0 (* 1 2)) 2 20 10

Scoping in Scheme unlike early LISPs, Scheme is statically scoped can nest functions and hide details (define (factorial N) (define (factorial-help N value-so-far) (if (zero? N) value-so-far (factorial-help (- N 1) (* N value-so-far)))) (factorial-help N 1)) since factorial-help is defined inside of factorial, hidden to outside since statically scoped, arguments in enclosing function are visible to enclosed functions (i.e., non-local variables) 21 When tail-recursion? (define (sum-up-to N) (define (sum-help N sum-so-far) (if (< N 1) sum-so-far (sum-help (- N 1) (+ N sum-so-far)))) (sum-help N 0)) (define (my-length lst) IN-CLASS EXERCISE (length-help lst 0)) usually, a full-recursive solution is simpler, more natural for a small number of repetitions, full-recursion is sufficient for a potentially large number of repetitions, need tail-recursion 22 11

Higher-order primitives (apply FUNCTION LIST) applies the function with the list elements as inputs (apply + '(1 2 3)) (+ 1 2 3) à 6 (apply min '(5 2 8 6)) (min 5 2 8 6) à 2 (map FUNCTION LIST) applies the function to each list element (map sqrt '(9 25 81)) (list (sqrt 9) (sqrt 25) (sqrt 81)) à (3 5 9) (map car '((a b) (c d) (e))) (list (car '(a b)) (car '(c d)) (car '(e))) à (a c e) 23 12