Difference between revisions of "Itty Bitty Programming Language Assignment"
Jump to navigation
Jump to search
(→Ast) |
|||
Line 13: | Line 13: | ||
=Code To Investigate= | =Code To Investigate= | ||
==Ast== | ==Ast== | ||
+ | ===Expression Structs=== | ||
<syntaxhighlight lang="racket"> | <syntaxhighlight lang="racket"> | ||
(struct IdentifierExp (name) #:transparent) | (struct IdentifierExp (name) #:transparent) | ||
Line 26: | Line 27: | ||
(struct FunctionExp (name_option parameter_name body_exp) #:transparent) | (struct FunctionExp (name_option parameter_name body_exp) #:transparent) | ||
(struct CallExp (function_exp argument_exp) #:transparent) | (struct CallExp (function_exp argument_exp) #:transparent) | ||
+ | </syntaxhighlight> | ||
+ | ===expression?=== | ||
+ | <syntaxhighlight lang="racket"> | ||
+ | (define (expression? exp) | ||
+ | (or (IdentifierExp? exp) | ||
+ | (IntExp? exp) | ||
+ | (AddExp? exp) | ||
+ | (IfGreaterExp? exp) | ||
+ | (NilExp? exp) | ||
+ | (IsNilExp? exp) | ||
+ | (ConsExp? exp) | ||
+ | (CarOfConsExp? exp) | ||
+ | (CdrOfConsExp? exp) | ||
+ | (LetExp? exp) | ||
+ | (FunctionExp? exp) | ||
+ | (CallExp? exp))) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 16:58, 6 March 2023
Contents
Credit
This assignment is based on MUPL by Dan Grossman and his team at UW.
Code To Use
Code To Investigate
Ast
Expression Structs
(struct IdentifierExp (name) #:transparent)
(struct IntExp (value) #:transparent)
(struct AddExp (left_exp right_exp) #:transparent)
(struct IfGreaterExp (left_exp right_exp then_body_exp else_body_exp) #:transparent)
(struct NilExp () #:transparent)
(struct IsNilExp (exp) #:transparent)
(struct ConsExp (car_exp cdr_exp) #:transparent)
(struct CarOfConsExp (cons_exp) #:transparent)
(struct CdrOfConsExp (cons_exp) #:transparent)
(struct LetExp (binding_name binding_exp body_exp) #:transparent)
(struct FunctionExp (name_option parameter_name body_exp) #:transparent)
(struct CallExp (function_exp argument_exp) #:transparent)
expression?
(define (expression? exp)
(or (IdentifierExp? exp)
(IntExp? exp)
(AddExp? exp)
(IfGreaterExp? exp)
(NilExp? exp)
(IsNilExp? exp)
(ConsExp? exp)
(CarOfConsExp? exp)
(CdrOfConsExp? exp)
(LetExp? exp)
(FunctionExp? exp)
(CallExp? exp)))
Code To Implement
Warmup
file: | src/main/racket/ibpl/warmup.rkt | |
functions: | racket-integers->ibpl-IntExps ibpl-IntExps->racket-integers |
racket-integers->ibpl-IntExps
ibpl-IntExps->racket-integers
Eval
file: | src/main/racket/ibpl/eval.rkt | |
functions: | value? expand-environment eval-under-env |
(struct closure (env function) #:transparent)
value?
IBPL expressions evaluate to Racket values. value?
determines if the paramater v
is a valid value.
Valid value types are cons cells, integers, closures, and the null empty list.
For a cons cell to be a valid value, its car and cdr must be valid values.
ensure-value?
(define (ensure-value? v)
(if (value? v)
v
(raise-argument-error 'v "value?" v)))
lookup-value-in-environment
(struct entry (name value) #:transparent)
(define (lookup-value-in-environment env identifier-name)
(cond [(null? env) (error "unbound identifier during evaluation" identifier-name)]
[(equal? (entry-name (car env)) identifier-name) (entry-value (car env))]
[#t (lookup-value-in-environment (cdr env) identifier-name)]))
expand-environment
Requirement: raise-argument-error for invalid parameters.
eval-under-env
eval-exp
(define (eval-exp e)
(eval-under-env e null))
Macros
IbIfNil
IbLet*
(struct binding (name exp) #:transparent)
IbIfEq
Functions
ib-double
ib-sum-curry
ib-call-with-one
ib-map
ib-mapAddN
Testing
file: | test_all.rkt | Test |
source folder: | src/test/racket/ibpl |
note: ensure that you have removed all printing to receive credit for any assignment.