This is the archived website of SI 413 from the Fall 2013 semester. Feel free to browse around; you may also find more recent offerings at my teaching page.
Many of these exercises are programming exercises, but you do not need to submit them electronically.
Write a function
(mixup x) that takes an argument
x, which can be any symbol or any number, and produces the opposite type of thing, either the number 5 if
x is a symbol, or the symbol
x is a number.
(mixup 20) should produce
(mixup 'hello) should produce
When you type
5 into the interpreter, it returns
When you type
(quote 5), it still returns the number
But when you type
(quote (quote 5)) or
''5, it returns
What do you think is going on here? Why do you need two quotes to make the symbol 5?
(Caution: this is pretty tricky. Think about how evaluation works. Play around, experiment, discuss.)
In the C programming language, give an example of each of the following types of code fragments.
An atom (or literal)
A value that is not an atom
An expression that is not a value
A statement that does not end in a semicolon
Write a Scheme expression that is equivalent to the following Java code, by using a series of 3 nested
int x = 1; x += 3; x *= 12; return x;
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.
You know that there is a built-in function called
and in Scheme. The built-in version actually takes any number of arguments, and always returns either
#f, but for this exercise we'll assume that
and only takes two arguments.
You should be able to convince yourself that every
and could be re-written as an
if. For example, consider the following function that tests whether the number
x is a "teen".
(define (teen? x) (and (>= x 13) (< x 20)))
Well this is exactly the same as:
(define (teen? x) (if (< x 13) #f (< x 20)))
Your task is to write a Scheme function
(and->if expr) that takes a quoted
and expression and returns an equivalent quoted
if expression that computes the same thing. (Note: the expression your code produces might not look exactly like what I have above, but it should be equivalent computationally.)
If you then
eval the result, it should work. For example, the following should produce
(define x 18) (eval (and->if '(and (>= x 13) (< x 20))) (interaction-environment))