This section is a short review and overview of the quote
function (more commonly seen as '
) and its functionalities to help you prep for the next section, calc.rkt
.
We have used quotation '
as a shortcut to create words and sentences since the beginning of this class. The example below should be painstakingly simple to understand:
> (define a 3)
3
> a
3
> 'a
a
The use of a single quote is actually a shortcut - 'a
is equivalent to
(quote a)
. Similarly, '(a 1 b 2)
is equivalent to (quote (a 1 b 2))
To check for equality, we can use the primitive eq?
> (eq? 'a 'a)
#t
> (eq? 'a 'b)
#f
> (eq? 'a (first 'afro))
#t
Another useful primitive for handling symbols/quotes is memq
. memq
takes
two arguments, a symbol and a list. If the symbol is not contained in the list
(i.e., it is not eq?
to any item in the list), then memq
returns false
.
Otherwise, it returns the sublist of the list beginning with the first
occurrence of the symbol:
>(memq 'apple '(banana raspberry windows android))
#f
>(memq 'apple '(banana raspberry windows apple android))
(apple android)
>(memq 'apple '(banana raspberry windows (apple android))
#f
Note that the last example returns #f
because (eq? 'apple '(apple
android))
returns #f. Thus, memq
does not work on deep lists.
You can implement memq
with the following definition:
(define (memq item x)
(cond ((null? x) false)
((eq? item (car x)) x)
(else (memq item (cdr x)))))
(memq 'everything '(sugar spice (everything nice)))
(memq 'chicken '(cow chicken cow and chicken))
For each of the following expressions, predict what Racket will print without using the interpreter. Then, use the interpreter to check your answers.
* `(list 'a 'b 'c)`
* `(list (list 'george))`
* `(cdr '((x1 x2) (y1 y2)))`
* `(cadr '((x1 x2) (y1 y2))`
* `(pair? (car '(a short list)))`
* `(memq 'red '((red shoes) (blue socks)))`
* `(memq 'red '(red shoes blue socks))`
In this subsection, you learned:
'hi
is a shorcut for (quote hi)
.memq
is a predicate that determines whether a symbol is in a list.