On this page:
Overview
Setup
Tasks
Before Submitting
Submitting

Homework 13🔗

Last updated: Wed, 4 Dec 2024 12:05:06 -0500

Out: Wed Dec 04, 2024, 12pm (noon) EST

Due: Wed Dec 11, 2024, 12pm (noon) EST

Overview🔗

In this assignment, you will get to use the "CS450 Lang" "high-level language" that you created!

This hw will be graded accordingly:

  • correctness (16 pts)

  • design recipe (32 pts) (testing 20 pts)

  • style (10 pts)

  • README (2 pt)

Total: 60 points

Setup🔗

Create a new repository for this assignment by going to the CS450 Fall 2024 GitHub Organization and clicking "New".

Note: The CS450 Fall 2024 GitHub Organization must be the owner of the repository. Do not create the repository in your own account.

On the "Create a new repository" screen:
  • Name the repository hw<X>-<LASTNAME>-<FIRSTNAME> where <X> is the current homework number.

    For example, I would name my hw13 repository hw13-Chang-Stephen.

  • Mark the repository as Private.

  • Check "Add a README file".

  • Select the Racket template for the .gitignore.

  • Choose whatever you wish for the license.

When done click "Create repository".

NEW!

Installing 450Lang

In this assignment, we will use our "450 lang" programming language, so we must install it first.

The easiest way to do so is from DrRacket, go to File -> Package Manager, and then install the 450lang package. This will allow you to use the language by writing #lang 450lang at the top of a file.

Tasks🔗

Reading

Notes and Reminders

Because we are using a different programming language for this assignment, we must do some other things (like testing) differently as well. Thus make sure to read the following list of hints and reminders.

Programming

In this assignment, you will get to use the "CS450 Lang" programming language you created!

Specifically, use our language to write the following recursive functions. You may use any sources to help you clarify or understand the problem. These are all well-known functions so you should have no problems finding information.

  1. ;; Ack : Nat Nat -> Nat
    ;; Computes the (2 argument) Ackermann function
    This function is famous because of it’s expensive time complexity (super exponential) so be careful when testing! (computing (ack 4 1) takes over 3 minutes on my machine)

  2. ;; isort : List<Num -> List<Num>
    ;; Takes a list of numbers and sorts it in ascending order.
    isort should call the following function (that you define):
    ;; insert : (Num Num -> Bool) Num List<X> -> List<X>
    ;; Takes a comparison function `cmp`, a number `x`, and a list of numbers,
    ;; and inserts the number into the list
    ;; immedicately before the first list element `y` where (cmp x y)=false.

  3. ;; reduce : (X Y -> Y) Y List<X> -> Y
    ;; Performs a left-fold with the given function, initial value, and list.
  4. ;; deg->rad : Degrees -> Radians
    ;; Converts an angle in degrees to radians
    ;; rad->deg : Radians -> Degrees
    ;; Converts an angle in radians to degrees
     
    ;; mk-fractal-tree : XCoord YCoord Degrees NonNegInt -> FractalTree
    ;; Starting at the given coordinate, computes a fractal tree by computing all its lines
    ;; Specifically, recur `depth` times, with each iteration turning by both plus/neg degrees
     
    ;; ftree->img : FractalTree -> Image
    ;; Computes a 2htdp/image of a fractal tree by
    ;; repeatedly using `add-line` to add lines to an `empty-image`

    A FractalTree is a List<Line> and a Line is a pair of (2htdp/image) coordinates (list x1 y1 x2 y2) that represents the endpoints of a line.

    A Fractal Tree is created by recursively creating the lines in the tree. Specifically, from a starting x_1,y_1 compute the endpoint of a line as follows:
    • x_2=x_1+d\cdot S\cdot cos(\theta)

    • x_y=y_1+d\cdot S\cdot sin(\theta)

    where d is the current depth, \theta is the current angle, and S is a SCALE constant. In each iteration, decrement the depth and adjust the angle by both positive and negative TURN-ANGLE degrees, where TURN-ANGLE is also a constant.

    When the depth is zero, end the computation.

    Here is an example of an image produced with:

    (flip-vertical (ftree->img (mk-fractal-tree 400 200 90 10)))

    (the flip-vertical is used because the 2htdp/image coordinate system creates an inverted tree due to positive=down)

Each function must follow the design recipe and include all required components. In particular, structurally recursion functions should follow their data definitions, while generative (non-structural) recursive functions should follow the Generative Recursion Recipe. Don’t forget to include a Termination Argument in the latter case.

Data Definitions

Here are the Data definitions used in the implementation of the programming language

Initial Environment

A language is only as useful as it’s initial environment, so this hw has many more "built in" functions and datatypes compare to previous assignments.

Before Submitting🔗

Testing

Before submitting, note:
  • Do not submit until all code has been thoroughly tested (by you).

  • Assignments may or may not use a GradeScope Autograder, but either way, an Autograder is not a software development tool so do not use it as one. Code must be tested independent of any Autograder.

  • If you submit and get an Autograder error, this means the code you wrote is not complete and/or not correct and it’s up to you to figure out why.

  • Of course, the course staff is here and eager to help, but cannot do so if a student does not explain what they’ve tried first (e.g., "why is the Autograder giving an error?" is not something we can help with). At the very least you should report what error you are seeing and which part of the error message you do not understand.

  • The Autograder test suite is subject to change. This means that the visible grade seen during submission is not the final grade.

Style

All code should follow proper Racket Style.

Also, the repository itself must follow proper style. Specifically, it must have appropriate commit messages. See How to Write a Git Commit Message if you are unsure how to write a commit message.

Files

A submission must have the following files in the repository root:

Submitting🔗

When you are done, submit your work to Gradescope hw13. You must use the "GitHub" Submission Method and select your hw<X>-<LASTNAME>-<FIRSTNAME> repository.

Note that this is the only acceptable way to submit homework in this course. (Do not manually upload files and do not email files to the course staff. Homework submitted via any unapproved methods will not be graded.)