csc324 principles of programming languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · exercise3...
TRANSCRIPT
![Page 1: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/1.jpg)
CSC324 Principles of Programming Languages
Lecture 4
October 2, 2019
![Page 2: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/2.jpg)
Exercise 3
I Well done! (lower mean than e2, but higher median)I Do not use mutation. In the future, any code that uses
mutation will be assigned a grade of 0.I If you don’t know how to solve a problem without mutationcome to office hours!
![Page 3: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/3.jpg)
Today
This next part of the course uses Racket macros to explore twoprogramming paradigms:
I Object-oriented programming (familiar from Python/Java)I Logic programming (likely new to you)
To build a language on top of Racket that supports OOP and LogicProgramming, we’ll use macros to introduce new syntax.
![Page 4: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/4.jpg)
Object-Oriented Programming
Concepts of Object-Oriented Programming (OOP) in languageslike Java and Python:
I Object: collection of attributes (instance variables), andmethods (functions) that operate on the attributes
I Class: determines the attributes and methods available to anobject
I Constructor: method that is called when a new object iscreated
![Page 5: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/5.jpg)
Python Example (point.py)
import math
class Point:def __init__(self, x, y):
self.x = xself.y = y
def from_origin(self):return math.sqrt(self.x ** 2 + self.y ** 2)
def same_distance(self, other):return self.from_origin() == other.
from_origin()
Objects. Classes. Attributes. Methods. Constructors. self. Canwe really model all of this in Racket?
![Page 6: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/6.jpg)
Implementing Attributes (point1.rkt)
I We can model an object as a functionI The function takes a symbol representing an attribute, and
returns the value of that attributeI “Message” is a common term for a request to an object
#lang racket(define (my−point msg)
(cond [(equal? msg 'x) 10][(equal? msg 'y) −5][else "Unrecognized message"]))
![Page 7: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/7.jpg)
Implementing Attributes. . .
#lang racket(define (my−point msg)
(cond [(equal? msg 'x) 10][(equal? msg 'y) −5][else "Unrecognized message"]))
Concerns
I How do we make more than one “point” object?I Can we support methods?
Let’s first figure out how to make multiple objects!
![Page 8: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/8.jpg)
Implementing Classes
I We’ll stick to our idea of modeling an object as a functionI We will model a class as a higher-order function
I Parameters: values of attributesI Return value: objectI The object can access the attributes through the closure!
![Page 9: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/9.jpg)
A First Implementation of Classes
#lang racket(define (Point x y)
(lambda (msg)(cond [(equal? msg 'x) x]
[(equal? msg 'y) y][else "Unrecognized message"])))
I Now, we can create as many Points as we likeI Each Point object has its own attributesI We get a (Point ...) “constructor” for free
![Page 10: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/10.jpg)
Lexical Scoping
Lexical scoping really saves the day here:
(define p (Point 2 3))(let ([x 10])
(p 'x))
When p looks up its x attribute, it had better be 2 (not 10)!
![Page 11: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/11.jpg)
Implementing Methods
I Add each method to the cond, like for instance variablesI But methods are functions that take 0 or more parameters
#lang racket(define (Point x y)
(lambda (msg)(cond [(equal? msg 'x) x]
[(equal? msg 'y) y][(equal? msg 'from−origin)(lambda ()
(sqrt (+ (* x x) (* y y))))][(equal? msg 'distance)(lambda (other−point)
(let ([dx (− x (other−point 'x))][dy (− y (other−point 'y))])
(sqrt (+ (* dx dx) (* dy dy)))))][else "Unrecognized message"])))
![Page 12: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/12.jpg)
OOP Features
What do we have so far?
I ClassesI ObjectsI ConstructorsI Ability to create multiple objects from a classI Attributes (values are in the closure; looked-up by the cond)I Methods (looked-up by the cond)
![Page 13: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/13.jpg)
Missing Feature
OOP & Macros Worksheet: Question 1
![Page 14: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/14.jpg)
Missing Feature: “self”
I We’ll come back to the implemention of “self”I But first. . .
![Page 15: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/15.jpg)
Improving the Syntax#lang racket(define (Point x y)
(lambda (msg)(cond [(equal? msg 'x) x]
[(equal? msg 'y) y][(equal? msg 'from−origin)(lambda ()
(sqrt (+ (* x x) (* y y))))][(equal? msg 'distance)(lambda (other−point)
(let ([dx (− x (other−point 'x))][dy (− y (other−point 'y))])
(sqrt (+ (* dx dx) (* dy dy)))))][else "Unrecognized message"])))
I The syntax doesn’t look object-oriented — we’re justdefining a bunch of functions
I Lots of boilerplate code for each attribute or method
![Page 16: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/16.jpg)
We would like a syntax that looks like this:
(my−class Point (x y)(method (from−origin)(sqrt (+ (* x x) (* y y)))))
How do we add new syntax like this to Racket?
![Page 17: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/17.jpg)
Macros
![Page 18: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/18.jpg)
Macros
I A macro is a “function” that operates not on values, but onsource code
I A macro takes code as its parameters and returns new code asits result
I Before a program is run, macro expansion is carried out totransform code according to the defined macros
![Page 19: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/19.jpg)
Text-Based Macros
What does this C program print?
#include <stdio.h>
#define swap(x, y) { int tmp; tmp = x; x = y; y = tmp; }
int main(void) {int a = 4, b = 99;printf("a %d, b %d\n", a, b);swap(a, b);printf("a %d, b %d\n", a, b);return 0;
}
![Page 20: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/20.jpg)
Text-Based Macros. . .
How about now? What does this C program print?
#include <stdio.h>
#define swap(x, y) { int tmp; tmp = x; x = y; y = tmp; }
int main(void) {int a = 4, tmp = 99;printf("a %d, tmp %d\n", a, tmp);swap(a, tmp);printf("a %d, tmp %d\n", a, tmp);return 0;
}
![Page 21: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/21.jpg)
Racket Macros are Hygenic
Compared to C macros:
I Racket macros work on the level of Abstract Syntax Trees(AST), not text
I AST: Tree (nested list) representation of the syntactic structureof code
I Racket macros are hygenic: they are statically-scoped, notdynamically-scoped
I They do not capture surrounding identifiers (like tmp in the Cexamples)
I Identifiers defined within a macro are not accessible outside ofthe macro
![Page 22: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/22.jpg)
List Comprehensions
We will write a macro to add list comprehensions to Racket!
Here’s how a list comprehension works in Haskell (similar inPython):
Prelude> [x + 2 | x <- [1, 2, 3, 10]][3,4,5,12]
As a grammar rule:
<list-comp> ="[" <out-expr> "|" <id> "<-" <list-expr> "]"
We would like to add this grammar rule to Racket.
![Page 23: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/23.jpg)
List Comprehensions. . .
Question: using what we already have in Racket, how can weimplement the functionality of a list comprehension?
Prelude> [x + 2 | x <- [1, 2, 3, 10]]
Using map!
> (map (lambda (x) (+ x 2)) (list 1 2 3 10))'(3 4 5 12)
Our macro will rewrite a list comprehension using map!
![Page 24: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/24.jpg)
List Comprehensions. . .
Question: using what we already have in Racket, how can weimplement the functionality of a list comprehension?
Prelude> [x + 2 | x <- [1, 2, 3, 10]]
Using map!
> (map (lambda (x) (+ x 2)) (list 1 2 3 10))'(3 4 5 12)
Our macro will rewrite a list comprehension using map!
![Page 25: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/25.jpg)
Transforming a List Comprehension
We want to transform an expression that looks like:
(list-comp <out-expr> : <id> <- <list-expr>)
. . . into . . .
(map (lambda (<id>) <out-expr>) <list-expr>)
![Page 26: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/26.jpg)
Macro, List Comps (lc.rkt)#lang racket(define−syntax list−comp
(syntax−rules (: <−)[(list−comp <out−expr> : <id> <− <list−expr>)(map (lambda (<id>) <out−expr>)
<list−expr>)]))
I syntax-rules: defines a pattern-based macroI (: <-): defines the keywords used by the macroI (list-comp <out-expr> : <id> <- <list-expr>): this
is a patternI (map (lambda (<id>) <out-expr>) <list-expr>): this
is a templateI A pattern and template together form one pattern ruleI We can have multiple pattern rules!
The template specifies how the new syntax should be generatedfrom the pattern.
![Page 27: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/27.jpg)
Macro, List Comps (lc.rkt)#lang racket(define−syntax list−comp
(syntax−rules (: <−)[(list−comp <out−expr> : <id> <− <list−expr>)(map (lambda (<id>) <out−expr>)
<list−expr>)]))
I syntax-rules: defines a pattern-based macroI (: <-): defines the keywords used by the macroI (list-comp <out-expr> : <id> <- <list-expr>): this
is a patternI (map (lambda (<id>) <out-expr>) <list-expr>): this
is a templateI A pattern and template together form one pattern ruleI We can have multiple pattern rules!
The template specifies how the new syntax should be generatedfrom the pattern.
![Page 28: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/28.jpg)
List Comprehensions with Filtering
Haskell and Python list comprehensions support filtering:
> [x + 2 | x <- [8, 2, 5, 1], x > 2][10,7]
![Page 29: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/29.jpg)
List Comprehensions with Filtering. . .
We want to transform code that looks like:
<list-comp-if> ="[" <out-expr> "|" <id> "<-" <list-expr>
"if" <condition> "]"
. . . into . . .
(map (lambda (<id>) <out-expr>)(filter (lambda (<id>) <condition>)
<list-expr>))
![Page 30: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/30.jpg)
Macro, List Comps with Filtering (lc2.rkt)
(define−syntax list−comp−if(syntax−rules (: <− if); This is the old pattern.[(list−comp−if <out−expr> :
<id> <− <list−expr>)(map (lambda (<id>) <out−expr>)
<list−expr>)]
; This is the new pattern.[(list−comp−if <out−expr> :
<id> <− <list−expr>if <condition>)
(map (lambda (<id>) <out−expr>)(filter (lambda (<id>)
<condition>)<list−expr>))]))
![Page 31: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/31.jpg)
Macro Ellipses
How might we support multiple “if”-filters in a list comprehension?
> (list-comp-if (+ x 2) : x <- (list 1 2 3 4 5)if (> x 1) (even? x))
'(4 6)
I We don’t know how many filters there will be, so we can’twrite a separate rule for each case
I Instead, we use the macro ellipse feature, which lets us bindzero or more expressions to a pattern variable
![Page 32: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/32.jpg)
Macro Ellipses. . .#lang racket(define−syntax list−comp−if
(syntax−rules (: <− if)[(list−comp−if <out−expr> :
<id> <− <list−expr>)(map (lambda (<id>) <out−expr>)
<list−expr>)]
[(list−comp−if <out−expr> :<id> <− <list−expr>if <condition> ...)
(map (lambda (<id>) <out−expr>)(filter (lambda (<id>)
(and <condition> ...))<list−expr>))]))
The <condition> ... allows zero or more expressions to comeafter the if.
![Page 33: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/33.jpg)
Macro Ellipses in Patterns
Works like a Kleene star in regular expressions
I <attr> ... matches zero or more expressions of any type
I (<x> <y>) ... matches zero or more “pairs” (note thatthese are not necessarily valid Racket expressions; <x> does nothave to be a function!)
I (<a> ...) ... matches zero or more “lists”
Worksheet Questions 3-5
![Page 34: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/34.jpg)
Macro Ellipses in Patterns
Works like a Kleene star in regular expressions
I <attr> ... matches zero or more expressions of any type
I (<x> <y>) ... matches zero or more “pairs” (note thatthese are not necessarily valid Racket expressions; <x> does nothave to be a function!)
I (<a> ...) ... matches zero or more “lists”
Worksheet Questions 3-5
![Page 35: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/35.jpg)
Macro Ellipses in Patterns
Works like a Kleene star in regular expressions
I <attr> ... matches zero or more expressions of any type
I (<x> <y>) ... matches zero or more “pairs” (note thatthese are not necessarily valid Racket expressions; <x> does nothave to be a function!)
I (<a> ...) ... matches zero or more “lists”
Worksheet Questions 3-5
![Page 36: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/36.jpg)
Macro Ellipses in Templates
Works like map: repeats the entire expression before the ellipsis,once for each match
I (list <attr> ...)I ((+ <x> <y>) ...)
Pattern variables and ellipsis should be used together; do notseparate the pattern variable from the ellipsis!
Worksheet Questions 6
![Page 37: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/37.jpg)
Macro Ellipses in Templates
Works like map: repeats the entire expression before the ellipsis,once for each match
I (list <attr> ...)I ((+ <x> <y>) ...)
Pattern variables and ellipsis should be used together; do notseparate the pattern variable from the ellipsis!
Worksheet Questions 6
![Page 38: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/38.jpg)
Errors in macro expansion
Three cases:
1. No macro pattern matches. Results in syntax error2. A macro pattern matches, but the resulting code is invalid.
Results in runtime error3. A macro pattern matches, and the resulting code is valid. No
errors. Yay!
![Page 39: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/39.jpg)
The my-class macro
![Page 40: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/40.jpg)
Creating Objects
Here’s where we ended up last time:#lang racket(define (Point x y)
(lambda (msg)(cond [(equal? msg 'x) x]
[(equal? msg 'y) y][(equal? msg 'from−origin)(lambda ()
(sqrt (+ (* x x) (* y y))))][(equal? msg 'distance)(lambda (other−point)
(let ([dx (− x (other−point 'x))][dy (− y (other−point 'y))])
(sqrt (+ (* dx dx) (* dy dy)))))][else "Unrecognized message"])))
![Page 41: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/41.jpg)
Desired Syntax
We want to write syntax like this:(my−class Point (x y)
(method (from−origin)(sqrt (+ (* x x) (* y y)))))
Macros will help us with exactly this kind of task!
![Page 42: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/42.jpg)
Step 1: Macro that supports attributes only
Example uses of macro:
I (my-class Point (x y))I (my-class Person (name age gender))I (my-class Pet (species name cuteness))
![Page 43: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/43.jpg)
One Attribute
Starting with this:
(my-class Point(x))
We want to rewrite to this:
(define (Point x)(lambda (msg)
(cond [(equal? msg 'x) x][else "Unrecognized message!"])))
![Page 44: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/44.jpg)
One Attribute. . .
[(equal? msg 'x) x]
I Name x is in the closure, so we can access itI But we also require 'x for the cond comparison
> (quote x)'x> (quote from-origin)'from-origin
![Page 45: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/45.jpg)
Macro that supports one attribute
#lang racket(define−syntax my−class
(syntax−rules ()[(my−class <class−name> (<attr>))(define (<class−name> <attr>)(lambda (msg)
(cond [(equal? msg (quote <attr>)) <attr>][else "Unrecognized message!"])))]))
![Page 46: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/46.jpg)
Multiple attributes
Starting with this:
(my-class Point(x y))
We want to rewrite to this:
(define (Point x y)(lambda (msg)
(cond [(equal? msg 'x) x][(equal? msg 'y) y][else "Unrecognized message!"])))
![Page 47: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/47.jpg)
Macro: Multiple Attributes
No problem for macro ellipses!#lang racket(define−syntax my−class
(syntax−rules ()[(my−class <class−name> (<attr> ...))(define (<class−name> <attr> ...)(lambda (msg)
(cond [(equal? msg (quote <attr>)) <attr>]...[else "Unrecognized message!"])))]))
![Page 48: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/48.jpg)
Macro Ellipses
This use of ... is a bit different from the others:
[(equal? msg (quote <attr>)) <attr>]...
Racket repeats the entire bracketed expression before the ...
![Page 49: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/49.jpg)
Step 2: Macro that supports methods!
I Attributes required only one use of ..., to support an arbitrarynumber of attributes
I But supporting methods will require two uses of ...!I arbitrary number of methodsI arbitrary number of parameters for each method
I Note the keyword method before each method
The desired syntax looks like:
(my-class <class-name> (<attr> ...)(method (<method-name> <param> ...) <body>)...)
![Page 50: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/50.jpg)
Methods. . .
Starting with this:
(method (bigger-x other) (> x (other 'x)))
We want to rewrite to this:
[(equal? msg 'bigger-x)(lambda (other) (> x (other 'x)))]
![Page 51: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/51.jpg)
Macros for methods: method name
Starting with this:
(method (<method-name> other) (> x (other 'x)))
We want to rewrite to this:
[(equal? msg (quote <method-name>))(lambda (other) (> x (other 'x)))]
![Page 52: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/52.jpg)
Macros for methods: body
Starting with this:
(method (<method-name> other) <body>)
We want to rewrite to this:
[(equal? msg (quote <method-name>))(lambda (other) <body>)]
![Page 53: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/53.jpg)
Macros for methods: parameter
Starting with this:
(method (<method-name> <param>) <body>)
We want to rewrite to this:
[(equal? msg (quote <method-name>))(lambda (<param>) <body>)]
![Page 54: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/54.jpg)
Macros for methods: zero or more parameters
Starting with this:
(method (<method-name> <param> ...) <body>)
We want to rewrite to this:
[(equal? msg (quote <method-name>))(lambda (<param> ...) <body>)]
![Page 55: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/55.jpg)
Macro: Attributes and Methods
#lang racket(define−syntax my−class
(syntax−rules (method)[(my−class <class−name>
(<attr> ...)(method (<method−name> <param> ...) <body>)...)
(define (<class−name> <attr> ...)(lambda (msg)
(cond [(equal? msg (quote <attr>)) <attr>]...[(equal? msg (quote <method−name>))(lambda (<param> ...) <body>)]
...[else "Unrecognized message!"])))]))
![Page 56: CSC324 Principles of Programming Languageslczhang/324/lec/lec04.pdf · 2019. 12. 12. · Exercise3 I Welldone! (lowermeanthane2,buthighermedian) I Donotusemutation. Inthefuture,anycodethatuses](https://reader035.vdocuments.us/reader035/viewer/2022062605/5fce46b1a5e3ca34b149677f/html5/thumbnails/56.jpg)
Next time
I Fixing issue in Worksheet Question #1I self