1;; Copyright 2013 Google Inc.
2;;
3;; Licensed under the Apache License, Version 2.0 (the "License");
4;; you may not use this file except in compliance with the License.
5;; You may obtain a copy of the License at
6;;
7;; http://www.apache.org/licenses/LICENSE-2.0
8;;
9;; Unless required by applicable law or agreed to in writing, software
10;; distributed under the License is distributed on an "AS IS" BASIS,
11;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12;; See the License for the specific language governing permissions and
13;; limitations under the License.
14
15(define-test test-mapcar-basics
16 "We can apply a function to each member
17 of a list using mapcar."
18 (defun times-two (x) (* x 2))
19 (assert-equal ____ (mapcar #'times-two '(1 2 3)))
20 (assert-equal ____ (mapcar #'first '((3 2 1)
21 ("little" "small" "tiny")
22 ("pigs" "hogs" "swine")))))
23
24
25(define-test test-mapcar-multiple-lists
26 "The mapcar function can be applied to
27 more than one list. It applies a function
28 to successive elements of the lists."
29 (assert-equal ____ (mapcar #'* '(1 2 3) '(4 5 6)))
30 (assert-equal ____ (mapcar #'list '("lisp" "are") '("koans" "fun"))))
31
32
33(define-test test-transpose-using-mapcar
34 "Replace the usage of WRONG-FUNCTION in 'transpose' with the
35 correct lisp function (don't forget the #')."
36 (defun WRONG-FUNCTION-1 (&rest rest) '())
37 (defun transpose (L) (apply #'mapcar (cons #'WRONG-FUNCTION-1 L)))
38 (assert-equal '((1 4 7)
39 (2 5 8)
40 (3 6 9))
41 (transpose '((1 2 3)
42 (4 5 6)
43 (7 8 9))))
44 (assert-equal '(("these" "pretzels" "are")
45 ("making" "me" "thirsty"))
46 (transpose '(("these" "making")
47 ("pretzels" "me")
48 ("are" "thirsty")))))
49
50
51(define-test test-reduce-basics
52 "The reduce function combines the elements
53 of a list, from left to right, by applying
54 a binary function to the list elements."
55 (assert-equal ___ (reduce #'+ '(1 2 3 4)))
56 (assert-equal ___ (reduce #'expt '(2 3 2))))
57
58
59(define-test test-reduce-right-to-left
60 "The keyword :from-end allows us to apply
61 reduce from right to left."
62 (assert-equal ___ (reduce #'+ '(1 2 3 4) :from-end t))
63 (assert-equal ___ (reduce #'expt '(2 3 2) :from-end t)))
64
65
66(define-test test-reduce-with-initial-value
67 "We can supply an initial value to reduce."
68 (assert-equal ___ (reduce #'expt '(10 21 34 43) :initial-value 1))
69 (assert-equal ___ (reduce #'expt '(10 21 34 43) :initial-value 0)))
70
71
72(defun WRONG-FUNCTION-2 (a b) (a))
73(defun WRONG-FUNCTION-3 (a b) (a))
74
75(define-test test-mapcar-and-reduce
76 "mapcar and reduce are a powerful combination.
77 insert the correct function names, instead of WRONG-FUNCTION-X
78 to define an inner product."
79 (defun inner (x y)
80 (reduce #'WRONG-FUNCTION-2 (mapcar #'WRONG-FUNCTION-3 x y)))
81 (assert-equal 32 (inner '(1 2 3) '(4 5 6)))
82 (assert-equal 310 (inner '(10 20 30) '(4 3 7))))
83