Homework 3

This is the archived website of SI 413 from the Fall 2012 semester. Feel free to browse around; you may also find more recent offerings at my teaching page.

Use a separate sheet of paper for your answers! Many of these exercises are programming exercises, but you do not need to submit them electronically. Everything should be turned in in one packet, all printed out for me to see.

# 1 Nested Lets

Write a Scheme expression that is equivalent to the following Java code, by using a series of 3 nested let expressions.

int x = 1;
x += 3;
x *= 12;
return x;

# 2 Homoiconicity

The Wikipedia page on homoiconicity claims that raw machine code can be considered homoiconic, just like Scheme.

Explain what this means in a few sentences of your own.

Then tell me what properties of most homoiconic languages (like Scheme) does machine code definitely not have.

Scheme has a built-in function add1 which adds 1 to its argument.

But what if we wanted to create a similar function like add2 or add20? Write a function that produces a function make-adder that takes an argument n and produces a lambda expression (function) that takes one argument and adds n to it.

So for example ((make-adder 5) 10) produces 15.

# 4 Expression Transformer

Write a Scheme function letter that takes a quoted let expression and turns it into an equivalent quoted lambda expression.

For example, calling

(letter '(let ((a 7)
(b 10))
(* a b)))

should produce the expression ((lambda (a b) (* a b)) 7 10). (And if you call eval on that expression from the interactions window in DrScheme, you should get the result, 70.)

# 5 The Doubler

1. Write a function (double f) which takes a 1-argument function f and produces a 1-argument function (as a lambda expression) that takes an argument x and applies f to it twice, like (f (f x)).

So for example calling ((double sqrt) 16) is the same as calling (sqrt (sqrt 16)), which is 2.

2. Can we do (double double)? What does it do?