DemeterF: Functions and Traversals in Combination

Slides:



Advertisements
Similar presentations
Higher-Order Functions and Loops c. Kathi Fisler,
Advertisements

Type Checking, Inference, & Elaboration CS153: Compilers Greg Morrisett.
The Singleton Pattern II Recursive Linked Structures.
Stacks & Their Applications COP Stacks  A stack is a data structure that stores information arranged like a stack.  We have seen stacks before.
Getting started with ML ML is a functional programming language. ML is statically typed: The types of literals, values, expressions and functions in a.
ML: a quasi-functional language with strong typing Conventional syntax: - val x = 5; (*user input *) val x = 5: int (*system response*) - fun len lis =
A Lightning Tour of Haskell Lecture 1, Designing and Using Combinators John Hughes.
Introduction to ML Last time: Basics: integers, Booleans, tuples,... simple functions introduction to data types This time, we continue writing an evaluator.
Functional programming: LISP Originally developed for symbolic computing First interactive, interpreted language Dynamic typing: values have types, variables.
Data Abstraction and Object- Oriented Programming CS351 – Programming Paradigms.
Functions in C. Consider #include main() { int i; for(i=1; i
Functional Programming and Lisp. Overview In a functional programming language, functions are first class objects. In a functional programming language,
Dr. Philip Cannata 1 Functions and Recursion. Dr. Philip Cannata 2 10 Java (Object Oriented) ASP RDF (Horn Clause Deduction, Semantic Web) Relation Jython.
Midterm CSG 110 Karl Lieberherr. Managing Software Development Managers of software development must first be software developers.
1 Functional Visitor Ø Motivation Example Container checking -- Make sure each Container is not overloaded Weight Item + int total( ) w Container + int.
CMSC 330: Organization of Programming Languages Operational Semantics a.k.a. “WTF is Project 4, Part 3?”
Lecture on Set! And Local CS 2135 Copyright Kathi Fisler, 2002 This material requires Advanced Language Level.
Code Generation CPSC 388 Ellen Walker Hiram College.
2014-T2 Lecture 27 School of Engineering and Computer Science, Victoria University of Wellington  Lindsay Groves, Marcus Frean, Peter Andreae, and Thomas.
String and Lists Dr. José M. Reyes Álamo.
Programming Language Concepts
User-Written Functions
Basic Scheme February 8, 2007 Compound expressions Rules of evaluation
B/B+ Trees 4.7.
Edited by Original material by Eric Grimson
ML: a quasi-functional language with strong typing
CS 5010 Program Design Paradigms "Bootcamp" Lesson 9.4
Introduction to C++ Systems Programming.
Containers and Lists CIS 40 – Introduction to Programming in Python
Introduction to Computer Science / Procedural – 67130
Java Primer 1: Types, Classes and Operators
Interpreters Study Semantics of Programming Languages through interpreters (Executable Specifications) cs7100(Prasad) L8Interp.
Lecture 14 - Environment Model (cont.) - Mutation - Stacks and Queues
Expanded Recursive Diagrams OCAML rapid tour, day 2
Emily Leland (Not Nick) Spring 2017
Methods The real power of an object-oriented programming language takes place when you start to manipulate objects. A method defines an action that allows.
Stack Lesson xx   This module shows you the basic elements of a type of linked list called a stack.
Case Study: Undefined Variables
CS 302 Week 11 Jim Williams, PhD.
Higher-Order Procedures
Arrays and Linked Lists
Chapter 4: Types.
Lesson Objectives Aims
Northeastern University, CCIS/PRL
The Metacircular Evaluator
Northeastern University, CCIS/PRL
DemeterF: Functions and Traversals in Combination
Functional Programming
The Metacircular Evaluator
File I/O in C Lecture 7 Narrator: Lecture 7: File I/O in C.
CSE 341 Section 5 Winter 2018.
String and Lists Dr. José M. Reyes Álamo.
3.4 Local Binding Recall Scheme's let: > (let ((x 5)‏ (y 6))
Adapted from slides by Nicholas Shahan and Dan Grossman
Lecture 13 - Assignment and the environments model Chapter 3
More Flexible Software By Favoring Implicit Calls and Implicit Communication by Karl Lieberherr Joint work with Bryan Chadwick, Ahmed Abdelmeged and Therapon.
6.001 SICP Environment model
Lecture 14 - Environment Model (cont.) - Mutation - Stacks and Queues
Lecture 14: The environment model (cont
Adapted from slides by Nicholas Shahan, Dan Grossman, and Tam Dang
Announcements Quiz 5 HW6 due October 23
Nicholas Shahan Spring 2016
Fundamental OOP Programming Structures in Java: Comments, Data Types, Variables, Assignments, Operators.
Intermediate Code Generation
In this class, we will cover:
Assignments and Procs w/Params
To understand recursion, one must first understand recursion.
Common Lisp II.
DemeterF.
Recursive Procedures and Scopes
Presentation transcript:

DemeterF: Functions and Traversals in Combination by Brian Chadwick

Introduction Do EoPL functions using functional transformations Translate a class dictionary into a traverser (that works with a visitor) transformer (that works with function objects)

Default Transformer copy object after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

Parameterize Default Transformer PathSpec apply(J j) { return new Complement(j); } after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

Parameterize Default Transformer PathSpec combine(J j, Boolean fn, Boolean sn) { return fn && sn; } PathSpec combine(Object j, Boolean fn, Boolean sn) { return fn && sn; } after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

Simple application Program transformation Old E : Num | Var | Op | Call … Op : Plus | Equals. Equals = “=“. New E : … | Bool. Bool : True | False. class BoolTrans extends IDf { static E newtrue = Call.parse(“(= 1 1)”), static E newfalse= Call.parse(“(= 1 0) “); E apply(True t) {return newtrue; } E apply(False t) {return newfalse; } } apply for transformation of result returned by builder

de Bruijn indices Old New Var : Sym. Sym = Ident. Var : Sym | Addr. for later de Bruijn indices Old Var : Sym. Sym = Ident. New Var : Sym | Addr. Addr = Integer. class AddrTrans extends IDf { Var apply(Var var, SymList senv) { return new Addr(senv.lookup(var));} } class SymExtender extends IDa { SymList update(Lambda l, SymList senv) { return senv.push(l.formals); }

The default Builder for PathSpec after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

well-formed movie show how the default builder is modified to combine Boolean objects.

The default Builder for PathSpec well-formed specialization 1 #t: true #f: false after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J #t :J 5 2 :S :S :S :S 3 #t 7 #t 8 #t 4 #t

The default Builder for PathSpec well-formed specialization 2 #t: true #f: false after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J #t :J #t 5 2 :S :S :S :S #t 7 #t 8 #t 3 4 #t

The default Builder for PathSpec well-formed specialization 3 #t: true #f: false after blue arrow copy is built (like after) #t 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 3 #t 7 #f 8 #t 4 #t

The default Builder for PathSpec well-formed specialization 4 #t: true #f: false after blue arrow copy is built (like after) #t 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. #f 6 :J :J 5 2 :S :S :S :S 3 #t 7 #f 8 #t 4 #t

The default Builder for PathSpec well-formed specialization 5 #t: true #f: false after blue arrow copy is built (like after) #t 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. #f 6 :J #t :J 5 2 :S :S :S :S #t 7 #f 8 #t 3 4 #t

The default Builder for PathSpec well-formed specialization 6 #t: true #f: false after blue arrow copy is built (like after) #t 10 #f :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 3 #t 7 #f 8 #t 4 #t

The default Builder for PathSpec well-formed specialization 7 #t: true #f: false after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 3 #t 7 #f 8 #t 4 #t

The default Builder for PathSpec well-formed specialization #t: true #f: false after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 #f 8 #t 3 #t 4 #t

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization means a copy after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization after blue arrow copy is built (like after) 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization insert NOT after blue arrow copy is built (like after) :N 10 :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

The default Builder for PathSpec NOT_JOIN_MERGE specialization insert NOT :M after blue arrow copy is built (like after) :N 10 :N :M 1 9 Count only upon first visit (red) and upon final visit (blue). For leaf nodes, count only in red. 6 :J :J 5 2 :S :S :S :S 7 8 3 4

Illustration of combine for capacity constraint violation 19 :C (w1+w2+w3+w4,2) :Cons (w1+w2+w3+w4,1) :E (w4,0) 1 20 2 18a 3 18 3a 13a :Cons (w1+w2+w3,1) after blue arrow combine is active (like after) 17a :C (w2+w3,1) 4 12a 17 :Cons (w1,0) 5 13 14 12 16a :Cons (w2+w3,0) 15a 6 :E (w1,0) :Empty (0,0) 11a 7a 15 16 11 :E (w3,0) :Cons (w2,0) 8 both containers (C) violate capacity constraints 7 10a 9a :E (w2,0) :Empty (0,0) 9 10

Illustration of combine for capacity constraint violation (w1+w2+w3+w4,2) :Cons (w1+w2+w3+w4,1) :E (w4,0) :Cons (w1+w2+w3,1) :C (w2+w3,1) :Cons (w1,0) :Cons (w2+w3,0) :E (w1,0) :Empty (0,0) :E (w3,0) :Cons (w2,0) both containers (C) violate capacity constraints :E (w2,0) :Empty (0,0)

Theory t[f,b](d) => d’, where d’=f(d), d is atomic On left side of => the term c(…) only indicates a compound object. Theory f = apply b = combine t[f,b](d) => d’, where d’=f(d), d is atomic t[f,b](c(d0, … ,dn)) => f(b(c(d0, … ,dn), d’0, … ,d’n)), where d’i = t[f,b](di) Default functions: id[f](d) => d id[b](c(d0, … ,dn), d’0, … ,d’n) => c(d0, … ,dn) b[c](c(d0, … ,dn), d’0, … ,d’n) => c(d’0, … ,d’n)

Theory f is a polymorphic function that takes a single argument and returns a result. b is a function object that is responsible for reconstruction of data types.

Traversal Component Approach implemented in DemeterF Traversal with 3 components: Builder (combine), Transformer (apply), Augmentor (update)

Augmentors / update methods so far: we covered combine and apply methods combine: to combine information up the object apply: to transform before the information is sent up. up refers to the traversal: when a traversal has finished visiting an object, it goes up. add: update, to send information down the object if it's not used/needed, it does not need to be mentioned, since the traversal will do the passing around.

motivating example: Address computation Var : Sym | Addr. Addr = Integer. class AddrTrans extends IDf { Var apply(Var var, SymList senv) { return new Addr(senv.lookup(var)); } } class SymExtender extends IDa { SymList update(Lambda la, Symlist senv){ return senv.push(la.formals); } }

Optional argument The argument passed *into* the traversal (by the programmer) is available everywhere (in every apply/combine/update function) but it may be needed only in some objects. In the typechecker case is only needed when looking up a variable use, or modifying the type-environment with a binding.  

Like a let for subtraversals An update argument can be viewed (almost) as a 'let' for sub-traversals: before traversing sub-terms we do a recalculation of the traversal argument. Update is called before traversing sub terms, and the modified value is only available for sub terms.

Structure-shy passing of argument If you look at the Scheme code you would write to traverse the same structure; you would pass along an argument to the functions, all the way through recursive calls until it is needed. At a lambda the recursive call on the body would look something like:   (type-Lambda l tenv)     (cases Exp l        (Lambda (arg body)          (type-Exp body (tenv-extend tenv arg)))        (Call (op arglist)           (let ((ret (type-Exp op tenv)) ...)        (... other cases...)))

Default: passing it along: no code needed with DemeterF Note that we don't change the traversal argument in most cases, only when binding an argument to a type. Usually we just keep passing it along throughout the traversal functions. The augmentor/update methods encapsulate (only) the changes of this argument, so we simply write: TEnv update(Lambda l, TEnv te) {return te.extend(l.formal);} The traversal takes care of the default case when we don't need to change the argument.

All arguments are optional All arguments are now optional... thus the most general method is:     Object combine(){ return ...; } Since it is applicable in all cases (all arguments optional, including the 'traversal argument'). (the traversal argument is the one updated by update methods. There is only one traversal argument)

AST illustration Call     |--- Lambda     |      |--- Arg     |      |     |--- Type     |      |     |     |--- int     |      |     |     |      |     |--- Sym     |      |           |--- 'a'     |      |     |      |--- Call     |            |--- Plus     |            |--- Sym     |            |     |--- 'a'     |            |     |            |--- Num     |                  |--- 2     |---  Num            |--- 4 Update is called at each label and the Object returned is then available to all terms 'connected' and to the right of that label.

Technical Details Methods you want to call determine from where you inherit: ID (all), IDa (update), IDb (combine), IDba (combine, update), IDf (apply), IDfa (apply, update), IDfb(apply, combine).

Motivation Showing a full scheme type-checking function, and highlighting the points where the type-environment is passed, used, and extended.  The number of cases where it is just passed along motivates the want/need to put the modifications in one place, and being able to ignore the argument when it's not really needed.

Traversal a function: