Title: Inductively Defined Data Concrete and Abstract syntax
1Inductively Defined DataConcrete and Abstract
syntax
2Dont believe the words
- Concrete syntax may be more abstract than
abstract syntax!!!
3Both Abstract and Concrete
- Exp Identifier
- var-exp (id)
- (lambda (Identifier) Exp)
- lambda-exp (id body)
- ( Exp ( Exp ) )
- app-exp (rator rand)
page 49 of EOPL 2 (replace Exp by Expression,
capitalize instead of angle)
4Both Abstract and Concrete
- Exp Id
- var-exp (id)
- (lambda ( Id ) Exp )
- lambda-exp (id body)
- ( Exp ( Exp ) )
- app-exp (rator rand)
- (define-datatype Exp Exp?
- (var-exp
- (id Id?))
- (lambda-exp
- (id Id?)
- (body Exp?))
- (app-exp
- (rator Exp?)
- (rand Exp?)))
page 49 of EOPL 2 (Exp by Expression, Id by
Identifier, capitalize instead of angle)
5Represent Id as symbol
- Exp Id
- var-exp (id)
- (lambda ( Id ) Exp )
- lambda-exp (id body)
- ( Exp ( Exp ) )
- app-exp (rator rand)
- (define-datatype Exp Exp?
- (var-exp
- (id symbol?))
- (lambda-exp
- (id symbol?)
- (body Exp?))
- (app-exp
- (rator Exp?)
- (rand Exp?)))
page 49 of EOPL 2 (Exp by Expression, Id by
Identifier, capitalize instead of angle)
6cases
- (define occurs-free?
- (lambda (var exp)
- (cases Exp e
- (var-exp (id) (eqv? id var))
- (lambda-exp (id body)
- and (not (eqv? id var))
- (occurs-free? var body)))
- (app-exp (rator rand) (or ))))))
7Exercises for define-datatype
- Arithmetic expressions ( ( 3 5) 7)
- two arguments only
- include evaluator
- Nested containers
8Exercise Test data type
- Contains in first a Lambda expression lambda-exp
and in second an Application app-exp. - Would like something like
- (define-struct Test (
- first type lambda-exp
- second type app-exp
- )
- but with the dynamic checking benefit of
define-datatype.
9Better Way variants are first class
- Exp Id
- var-exp (id)
- (lambda ( Id ) Exp )
- lambda-exp (id body)
- ( Exp ( Exp ) )
- app-exp (rator rand)
- (define-datatype Exp Exp?
- (var-exp
- (id symbol?))
- (lambda-exp
- (id symbol?)
- (body Exp?))
- (app-exp
- (rator Exp?)
- (rand Exp?)))
Better way Exp VarExp LambdaExp
AppExp. VarExp Id. LambdaExp (lambda (
ltidgt Id ltbodygt Exp ). AppExp ( ltratorgt Exp
ltrandgt Exp ). Test ltfirstgt LambdaExp ltsecondgt
AppExp. Each non-terminal defines a data type.
10Concern analysis
- (define (check ac)
- (local ( Container -gt Number
- the weight of a container
- effect the number of capacity
violations in a container - (define (weight-container ac)
- (local (define witems (weight-loi
(Container-contents ac))) - (when (gt witems (Container-capacity
ac)) - (set! violations ( 1
violations))) - witems))
- (Listof Item) -gt Number
- the weight of a list of items
- (define (weight-loi l)
- (foldr 0 (map weight-item l)))
- Item -gt Number
- the weight of an item
- (define (weight-item l)
- (cond
- (Simple? l) (Simple-weight l)
- (Container? l) (weight-container
l)))
Concerns traversal summing weights summing
violations
11Concrete syntax more Abstract than Abstract
Syntax example
- Exp Identifier
- var-exp (id)
- (lambda (Identifier)
List(Exp)) - lambda-exp (id body)
- ( Exp ( List(Exp) ) )
- app-exp (rator rand)
page 49 of EOPL 2 (replace Exp by Expression,
capitalize instead of angle)