CS 5510 Homework 13

Due: Thursday, December 5th, 2013 11:59pm

Part 1 — Boxes

Start with 5.rkt and add box and unbox:

  <Expr> = ...
         | {box <Expr>}
         | {unbox <Expr>}

Your interpreter can assume that the argument to unbox is always a box.

Examples:

  (reset!)
  (vtest (interpx (compile
                   (parse '{unbox {unbox {box {box 3}}}})
                   mt-env)
                  empty-env
                  (init-k))
         (numV 3))  (reset!)
  
  (reset!)
  (vtest (interpx (compile
                   (parse
                    '{{lambda {mkrec}
                        {{{lambda {chain}
                            {lambda {unchain}
                              ;; Make a chain of boxes, then traverse
                              ;; them:
                              {{unchain 13} {chain 13}}}}
                          ;; Create recursive chain function:
                          {mkrec
                           {lambda {chain}
                             {lambda {n}
                               {if0 n
                                    1
                                    {box {chain {+ n -1}}}}}}}}
                         ;; Create recursive unchain function:
                         {mkrec
                          {lambda {unchain}
                            {lambda {n}
                              {lambda {b}
                                {if0 n
                                     b
                                     {unbox {{unchain {+ n -1}} b}}}}}}}}}
                      ;; mkrec:
                      {lambda {body-proc}
                        {{lambda {fX}
                           {fX fX}}
                         {lambda {fX}
                           {body-proc {lambda {x} {{fX fX} x}}}}}}})
                   mt-env)
                  empty-env
                  (init-k))
         (numV 1))

Part 2 — Extra Credit: Box Assignment

Add set-box!:

  <Expr> = ...
         | {set-box! <Expr> <Expr>}

You can make set-box! return whatever you like, and your interpreter can assume that the first argument to set-box! is always a box.

  (reset!)
  (vtest (interpx (compile
                   (parse '{{lambda {b}
                              {{lambda {z}
                                 {unbox b}}
                               {set-box! b {+ {unbox b} 1}}}}
                            {box 3}})
                   mt-env)
                  empty-env
                  (init-k))
         (numV 4))

Last update: Wednesday, December 11th, 2013
mflatt@cs.utah.edu