Add solutions to section 01 - equalities
This commit is contained in:
parent
a8fe71e26f
commit
b2e0b6e179
38 changed files with 32 additions and 851 deletions
32
01_equalities.clj
Normal file
32
01_equalities.clj
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
; "We shall contemplate truth by testing reality, via equality"
|
||||
(= true true)
|
||||
|
||||
; "To understand reality, we must compare our expectations against reality"
|
||||
(= 2 (+ 1 1))
|
||||
|
||||
; "You can test equality of many things"
|
||||
(= 5 (+ 3 4) 7 (+ 2 __))
|
||||
|
||||
; "Some things may appear different, but be the same"
|
||||
(= true (= 2 2/1))
|
||||
|
||||
; "You cannot generally float to heavens of integers"
|
||||
(= false (= 2 2.0))
|
||||
|
||||
; "But a looser equality is also possible"
|
||||
(= true (== 2.0 2))
|
||||
|
||||
; "Something is not equal to nothing"
|
||||
(= true (not (= 1 nil)))
|
||||
|
||||
; "Strings, and keywords, and symbols: oh my!"
|
||||
(= false (= "hello" :hello 'hello))
|
||||
|
||||
; "Make a keyword with your keyboard"
|
||||
(= :hello (keyword "hello"))
|
||||
|
||||
; "Symbolism is all around us"
|
||||
(= 'hello (symbol "hello"))
|
||||
|
||||
; "When things cannot be equal, they must be different"
|
||||
(not= :fill-in-the-blank "anything here")
|
||||
159
README.md
159
README.md
|
|
@ -1,159 +0,0 @@
|
|||
# Clojure Koans
|
||||
|
||||
The Clojure Koans are a fun and easy way to get started with Clojure - no
|
||||
experience assumed or required. Just follow the instructions below to start
|
||||
making tests pass!
|
||||
|
||||
|
||||
### Getting Started
|
||||
|
||||
The easiest and fastest way to get the koans up and running is to [download the
|
||||
latest zip file from Github](https://github.com/functional-koans/clojure-koans/releases).
|
||||
This way, you'll have all the dependencies you need, including Clojure itself
|
||||
and JLine, and you can skip the rest of this section (skip to "Running the
|
||||
Koans").
|
||||
|
||||
If you're starting from a cloned or forked repo, that's cool too. This way
|
||||
you'll be able to track your progress in Git, and see how your answers compare
|
||||
to others, by checking out the project's Network tab. You might want to create
|
||||
your own branch - that way if you pull back the latest koans from master, it'll
|
||||
be a bit easier to manage the inevitable conflicts if we make changes to
|
||||
exercises you've already completed.
|
||||
|
||||
The only things you'll need to run the Clojure Koans are:
|
||||
|
||||
- JRE 1.6 or higher
|
||||
- [clojure-1.8.0.jar](http://repo1.maven.org/maven2/org/clojure/clojure/1.8.0/clojure-1.8.0.zip)
|
||||
|
||||
You can use [Leiningen](http://github.com/technomancy/leiningen) to
|
||||
automatically install the Clojure jar in the right place. Leiningen will also
|
||||
get you a couple more jarfiles, including JLine, which allows you some of the
|
||||
functionality of readline (command-line history, for example).
|
||||
|
||||
### Installing dependencies
|
||||
|
||||
Dependencies are installed automatically with lein 2, but if for some reason
|
||||
you're on lein 1 and can't upgrade, you'll need to run
|
||||
|
||||
`lein deps`
|
||||
|
||||
which will download all dependencies you need to run the Clojure koans.
|
||||
|
||||
I strongly recommend that you upgrade to lein 2 instead!
|
||||
|
||||
### Running the Koans
|
||||
|
||||
If you're running from the zipfile, simply run
|
||||
|
||||
`script/run` on Mac/\*nix
|
||||
|
||||
`script\run` on Windows
|
||||
|
||||
If you're running from a checkout using lein 2, run the koans via
|
||||
|
||||
`lein koan run`
|
||||
|
||||
It's an auto-runner, so as you save your files with the correct answers, it will
|
||||
advance you to the next koan or file (conveniently, all files are prefixed with
|
||||
the sequence that you should follow).
|
||||
|
||||
You'll see something like this:
|
||||
|
||||
Now meditate on /home/colin/Projects/clojure-koans/src/koans/01_equalities.clj:3
|
||||
---------------------
|
||||
Assertion failed!
|
||||
We shall contemplate truth by testing reality, via equality.
|
||||
(= __ true)
|
||||
|
||||
The output is telling you that you have a failing test in the file named
|
||||
`01_equalities.clj`, on line 3. So you just need to open that file up and make
|
||||
it pass! You'll always be filling in the blanks to make tests pass.
|
||||
Sometimes there could be several correct answers (or even an infinite number):
|
||||
any of them will work in these cases. Some tests will pass even if you replace
|
||||
the blanks with whitespace (or nothing) instead of the expected answer. Make sure
|
||||
you give one correct expression to replace each blank.
|
||||
|
||||
The koans differ from normal TDD in that the tests are already written for you,
|
||||
so you'll have to pay close attention to the failure messages, because up until
|
||||
the very end, making a test pass just means that the next failure message comes
|
||||
up.
|
||||
|
||||
While it might be easy (especially at first) to just fill in the blanks making
|
||||
things pass, you should work thoughtfully, making sure you understand why the
|
||||
answer is what it is. Enjoy your path to Clojure enlightenment!
|
||||
|
||||
|
||||
### Trying more things out
|
||||
|
||||
There's a REPL (Read-Evaluate-Print Loop) included in the Clojure Koans. Just
|
||||
run:
|
||||
|
||||
`script/repl` on Mac/\*nix
|
||||
|
||||
`script\repl` on Windows
|
||||
|
||||
If you're on lein 2, `lein repl` is what you want instead.
|
||||
|
||||
Here are some interesting commands you might try, once you're in a running REPL:
|
||||
|
||||
```clojure
|
||||
(find-doc "vec")
|
||||
(find-doc #"vec$")
|
||||
(doc vec)
|
||||
```
|
||||
|
||||
And if those still don't make sense:
|
||||
|
||||
```clojure
|
||||
(doc doc)
|
||||
(doc find-doc)
|
||||
```
|
||||
|
||||
will show you what those commands mean.
|
||||
|
||||
You can exit the REPL with `CTRL-d` on any OS.
|
||||
|
||||
|
||||
### Contributing
|
||||
|
||||
Patches are encouraged! Make sure the answer sheet still passes
|
||||
(`lein koan test`), and send a pull request.
|
||||
|
||||
The file ideaboard.txt has lots of good ideas for new koans to start, or things
|
||||
to add to existing koans. So write some fun exercises, add your answers to
|
||||
`resources/koans.clj`, and we'll get them in there!
|
||||
|
||||
Please follow the guidelines in
|
||||
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html for
|
||||
commmit messages, and put your code in a feature branch (not master) before
|
||||
making the pull request. This makes patches easier to review.
|
||||
|
||||
Feel free to contact me (Colin Jones / trptcolin) on Github or elsewhere if you
|
||||
have any questions or want more direction before you start pitching in.
|
||||
|
||||
|
||||
### Contributors
|
||||
|
||||
https://github.com/functional-koans/clojure-koans/contributors
|
||||
|
||||
|
||||
### Credits
|
||||
|
||||
These exercises were started by [Aaron Bedra](http://github.com/abedra) of
|
||||
[Relevance, Inc.](http://github.com/relevance) in early 2010, as a learning
|
||||
tool for newcomers to functional programming. Aaron's macro-fu makes these
|
||||
koans extremely simple and fun to use, and to improve upon, and without
|
||||
Relevance's initiative, this project would not exist.
|
||||
|
||||
Using the [koans](http://en.wikipedia.org/wiki/koan) metaphor as a tool for
|
||||
learning a programming language started with the
|
||||
[Ruby Koans](http://rubykoans.com) by [EdgeCase](http://github.com/edgecase).
|
||||
|
||||
|
||||
### License
|
||||
|
||||
The use and distribution terms for this software are covered by the
|
||||
Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
||||
which can be found in the file epl-v10.html at the root of this distribution.
|
||||
By using this software in any fashion, you are agreeing to be bound by
|
||||
the terms of this license.
|
||||
261
epl-v10.html
261
epl-v10.html
|
|
@ -1,261 +0,0 @@
|
|||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
|
||||
<title>Eclipse Public License - Version 1.0</title>
|
||||
<style type="text/css">
|
||||
body {
|
||||
size: 8.5in 11.0in;
|
||||
margin: 0.25in 0.5in 0.25in 0.5in;
|
||||
tab-interval: 0.5in;
|
||||
}
|
||||
p {
|
||||
margin-left: auto;
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
p.list {
|
||||
margin-left: 0.5in;
|
||||
margin-top: 0.05em;
|
||||
margin-bottom: 0.05em;
|
||||
}
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body lang="EN-US">
|
||||
|
||||
<p align=center><b>Eclipse Public License - v 1.0</b></p>
|
||||
|
||||
<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
|
||||
PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
|
||||
DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
|
||||
AGREEMENT.</p>
|
||||
|
||||
<p><b>1. DEFINITIONS</b></p>
|
||||
|
||||
<p>"Contribution" means:</p>
|
||||
|
||||
<p class="list">a) in the case of the initial Contributor, the initial
|
||||
code and documentation distributed under this Agreement, and</p>
|
||||
<p class="list">b) in the case of each subsequent Contributor:</p>
|
||||
<p class="list">i) changes to the Program, and</p>
|
||||
<p class="list">ii) additions to the Program;</p>
|
||||
<p class="list">where such changes and/or additions to the Program
|
||||
originate from and are distributed by that particular Contributor. A
|
||||
Contribution 'originates' from a Contributor if it was added to the
|
||||
Program by such Contributor itself or anyone acting on such
|
||||
Contributor's behalf. Contributions do not include additions to the
|
||||
Program which: (i) are separate modules of software distributed in
|
||||
conjunction with the Program under their own license agreement, and (ii)
|
||||
are not derivative works of the Program.</p>
|
||||
|
||||
<p>"Contributor" means any person or entity that distributes
|
||||
the Program.</p>
|
||||
|
||||
<p>"Licensed Patents" mean patent claims licensable by a
|
||||
Contributor which are necessarily infringed by the use or sale of its
|
||||
Contribution alone or when combined with the Program.</p>
|
||||
|
||||
<p>"Program" means the Contributions distributed in accordance
|
||||
with this Agreement.</p>
|
||||
|
||||
<p>"Recipient" means anyone who receives the Program under
|
||||
this Agreement, including all Contributors.</p>
|
||||
|
||||
<p><b>2. GRANT OF RIGHTS</b></p>
|
||||
|
||||
<p class="list">a) Subject to the terms of this Agreement, each
|
||||
Contributor hereby grants Recipient a non-exclusive, worldwide,
|
||||
royalty-free copyright license to reproduce, prepare derivative works
|
||||
of, publicly display, publicly perform, distribute and sublicense the
|
||||
Contribution of such Contributor, if any, and such derivative works, in
|
||||
source code and object code form.</p>
|
||||
|
||||
<p class="list">b) Subject to the terms of this Agreement, each
|
||||
Contributor hereby grants Recipient a non-exclusive, worldwide,
|
||||
royalty-free patent license under Licensed Patents to make, use, sell,
|
||||
offer to sell, import and otherwise transfer the Contribution of such
|
||||
Contributor, if any, in source code and object code form. This patent
|
||||
license shall apply to the combination of the Contribution and the
|
||||
Program if, at the time the Contribution is added by the Contributor,
|
||||
such addition of the Contribution causes such combination to be covered
|
||||
by the Licensed Patents. The patent license shall not apply to any other
|
||||
combinations which include the Contribution. No hardware per se is
|
||||
licensed hereunder.</p>
|
||||
|
||||
<p class="list">c) Recipient understands that although each Contributor
|
||||
grants the licenses to its Contributions set forth herein, no assurances
|
||||
are provided by any Contributor that the Program does not infringe the
|
||||
patent or other intellectual property rights of any other entity. Each
|
||||
Contributor disclaims any liability to Recipient for claims brought by
|
||||
any other entity based on infringement of intellectual property rights
|
||||
or otherwise. As a condition to exercising the rights and licenses
|
||||
granted hereunder, each Recipient hereby assumes sole responsibility to
|
||||
secure any other intellectual property rights needed, if any. For
|
||||
example, if a third party patent license is required to allow Recipient
|
||||
to distribute the Program, it is Recipient's responsibility to acquire
|
||||
that license before distributing the Program.</p>
|
||||
|
||||
<p class="list">d) Each Contributor represents that to its knowledge it
|
||||
has sufficient copyright rights in its Contribution, if any, to grant
|
||||
the copyright license set forth in this Agreement.</p>
|
||||
|
||||
<p><b>3. REQUIREMENTS</b></p>
|
||||
|
||||
<p>A Contributor may choose to distribute the Program in object code
|
||||
form under its own license agreement, provided that:</p>
|
||||
|
||||
<p class="list">a) it complies with the terms and conditions of this
|
||||
Agreement; and</p>
|
||||
|
||||
<p class="list">b) its license agreement:</p>
|
||||
|
||||
<p class="list">i) effectively disclaims on behalf of all Contributors
|
||||
all warranties and conditions, express and implied, including warranties
|
||||
or conditions of title and non-infringement, and implied warranties or
|
||||
conditions of merchantability and fitness for a particular purpose;</p>
|
||||
|
||||
<p class="list">ii) effectively excludes on behalf of all Contributors
|
||||
all liability for damages, including direct, indirect, special,
|
||||
incidental and consequential damages, such as lost profits;</p>
|
||||
|
||||
<p class="list">iii) states that any provisions which differ from this
|
||||
Agreement are offered by that Contributor alone and not by any other
|
||||
party; and</p>
|
||||
|
||||
<p class="list">iv) states that source code for the Program is available
|
||||
from such Contributor, and informs licensees how to obtain it in a
|
||||
reasonable manner on or through a medium customarily used for software
|
||||
exchange.</p>
|
||||
|
||||
<p>When the Program is made available in source code form:</p>
|
||||
|
||||
<p class="list">a) it must be made available under this Agreement; and</p>
|
||||
|
||||
<p class="list">b) a copy of this Agreement must be included with each
|
||||
copy of the Program.</p>
|
||||
|
||||
<p>Contributors may not remove or alter any copyright notices contained
|
||||
within the Program.</p>
|
||||
|
||||
<p>Each Contributor must identify itself as the originator of its
|
||||
Contribution, if any, in a manner that reasonably allows subsequent
|
||||
Recipients to identify the originator of the Contribution.</p>
|
||||
|
||||
<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
|
||||
|
||||
<p>Commercial distributors of software may accept certain
|
||||
responsibilities with respect to end users, business partners and the
|
||||
like. While this license is intended to facilitate the commercial use of
|
||||
the Program, the Contributor who includes the Program in a commercial
|
||||
product offering should do so in a manner which does not create
|
||||
potential liability for other Contributors. Therefore, if a Contributor
|
||||
includes the Program in a commercial product offering, such Contributor
|
||||
("Commercial Contributor") hereby agrees to defend and
|
||||
indemnify every other Contributor ("Indemnified Contributor")
|
||||
against any losses, damages and costs (collectively "Losses")
|
||||
arising from claims, lawsuits and other legal actions brought by a third
|
||||
party against the Indemnified Contributor to the extent caused by the
|
||||
acts or omissions of such Commercial Contributor in connection with its
|
||||
distribution of the Program in a commercial product offering. The
|
||||
obligations in this section do not apply to any claims or Losses
|
||||
relating to any actual or alleged intellectual property infringement. In
|
||||
order to qualify, an Indemnified Contributor must: a) promptly notify
|
||||
the Commercial Contributor in writing of such claim, and b) allow the
|
||||
Commercial Contributor to control, and cooperate with the Commercial
|
||||
Contributor in, the defense and any related settlement negotiations. The
|
||||
Indemnified Contributor may participate in any such claim at its own
|
||||
expense.</p>
|
||||
|
||||
<p>For example, a Contributor might include the Program in a commercial
|
||||
product offering, Product X. That Contributor is then a Commercial
|
||||
Contributor. If that Commercial Contributor then makes performance
|
||||
claims, or offers warranties related to Product X, those performance
|
||||
claims and warranties are such Commercial Contributor's responsibility
|
||||
alone. Under this section, the Commercial Contributor would have to
|
||||
defend claims against the other Contributors related to those
|
||||
performance claims and warranties, and if a court requires any other
|
||||
Contributor to pay any damages as a result, the Commercial Contributor
|
||||
must pay those damages.</p>
|
||||
|
||||
<p><b>5. NO WARRANTY</b></p>
|
||||
|
||||
<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
|
||||
PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
||||
OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
|
||||
ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
|
||||
OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
|
||||
responsible for determining the appropriateness of using and
|
||||
distributing the Program and assumes all risks associated with its
|
||||
exercise of rights under this Agreement , including but not limited to
|
||||
the risks and costs of program errors, compliance with applicable laws,
|
||||
damage to or loss of data, programs or equipment, and unavailability or
|
||||
interruption of operations.</p>
|
||||
|
||||
<p><b>6. DISCLAIMER OF LIABILITY</b></p>
|
||||
|
||||
<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
|
||||
NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
|
||||
WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
|
||||
DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
|
||||
HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
|
||||
|
||||
<p><b>7. GENERAL</b></p>
|
||||
|
||||
<p>If any provision of this Agreement is invalid or unenforceable under
|
||||
applicable law, it shall not affect the validity or enforceability of
|
||||
the remainder of the terms of this Agreement, and without further action
|
||||
by the parties hereto, such provision shall be reformed to the minimum
|
||||
extent necessary to make such provision valid and enforceable.</p>
|
||||
|
||||
<p>If Recipient institutes patent litigation against any entity
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that the
|
||||
Program itself (excluding combinations of the Program with other
|
||||
software or hardware) infringes such Recipient's patent(s), then such
|
||||
Recipient's rights granted under Section 2(b) shall terminate as of the
|
||||
date such litigation is filed.</p>
|
||||
|
||||
<p>All Recipient's rights under this Agreement shall terminate if it
|
||||
fails to comply with any of the material terms or conditions of this
|
||||
Agreement and does not cure such failure in a reasonable period of time
|
||||
after becoming aware of such noncompliance. If all Recipient's rights
|
||||
under this Agreement terminate, Recipient agrees to cease use and
|
||||
distribution of the Program as soon as reasonably practicable. However,
|
||||
Recipient's obligations under this Agreement and any licenses granted by
|
||||
Recipient relating to the Program shall continue and survive.</p>
|
||||
|
||||
<p>Everyone is permitted to copy and distribute copies of this
|
||||
Agreement, but in order to avoid inconsistency the Agreement is
|
||||
copyrighted and may only be modified in the following manner. The
|
||||
Agreement Steward reserves the right to publish new versions (including
|
||||
revisions) of this Agreement from time to time. No one other than the
|
||||
Agreement Steward has the right to modify this Agreement. The Eclipse
|
||||
Foundation is the initial Agreement Steward. The Eclipse Foundation may
|
||||
assign the responsibility to serve as the Agreement Steward to a
|
||||
suitable separate entity. Each new version of the Agreement will be
|
||||
given a distinguishing version number. The Program (including
|
||||
Contributions) may always be distributed subject to the version of the
|
||||
Agreement under which it was received. In addition, after a new version
|
||||
of the Agreement is published, Contributor may elect to distribute the
|
||||
Program (including its Contributions) under the new version. Except as
|
||||
expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
|
||||
rights or licenses to the intellectual property of any Contributor under
|
||||
this Agreement, whether expressly, by implication, estoppel or
|
||||
otherwise. All rights in the Program not expressly granted under this
|
||||
Agreement are reserved.</p>
|
||||
|
||||
<p>This Agreement is governed by the laws of the State of New York and
|
||||
the intellectual property laws of the United States of America. No party
|
||||
to this Agreement will bring a legal action under this Agreement more
|
||||
than one year after the cause of action arose. Each party waives its
|
||||
rights to a jury trial in any resulting litigation.</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
Concepts / Language Features
|
||||
=====
|
||||
|
||||
Quoting
|
||||
|
||||
new record syntax
|
||||
Agents
|
||||
Vars
|
||||
state identity lifetime
|
||||
immutability / side effects
|
||||
type hints
|
||||
Pre and Post conditions of functions
|
||||
ex-info/ex-data
|
||||
reducers (?)
|
||||
transducers (?) - maybe just some basic ones, nothing too crazy
|
||||
|
||||
Particular Functions
|
||||
=====
|
||||
fnil - creating_a_function
|
||||
juxt - creating_a_function
|
||||
constantly - creating_a_function
|
||||
flatten
|
||||
|
||||
frequencies
|
||||
reductions
|
||||
keep
|
||||
keep-indexed
|
||||
map-indexed
|
||||
partition-all
|
||||
partition-by
|
||||
repeatedly
|
||||
10
project.clj
10
project.clj
|
|
@ -1,10 +0,0 @@
|
|||
(defproject clojure-koans "0.5.1-SNAPSHOT"
|
||||
:description "The Clojure koans."
|
||||
:dependencies [[org.clojure/clojure "1.8.0"]
|
||||
[koan-engine "0.2.3"]]
|
||||
:dev-dependencies [[lein-koan "0.1.3"]]
|
||||
:profiles {:dev {:dependencies [[lein-koan "0.1.3"]]}}
|
||||
:repl-options {:init-ns koan-engine.runner
|
||||
:init (do (use '[koan-engine.core]))}
|
||||
:plugins [[lein-koan "0.1.3"]]
|
||||
:main koan-engine.runner/exec)
|
||||
|
|
@ -1,256 +0,0 @@
|
|||
[["01_equalities" {"__" [true
|
||||
2
|
||||
5
|
||||
true
|
||||
false
|
||||
true
|
||||
true
|
||||
false
|
||||
"hello"
|
||||
"hello"
|
||||
3]}]
|
||||
|
||||
["02_strings" {"__" ["hello"
|
||||
"world"
|
||||
"Cool "
|
||||
"right?"
|
||||
0
|
||||
11
|
||||
false
|
||||
6 11
|
||||
"123"
|
||||
", "
|
||||
"1" "2" "3"
|
||||
"olleh"
|
||||
"hello"
|
||||
13
|
||||
nil
|
||||
"hello world"
|
||||
true
|
||||
false
|
||||
false
|
||||
"a"
|
||||
true
|
||||
true
|
||||
false]}]
|
||||
|
||||
["03_lists" {"__" [1 2 3 4 5
|
||||
1
|
||||
[2 3 4 5]
|
||||
3
|
||||
0
|
||||
()
|
||||
[:a :b :c :d :e]
|
||||
[:e :a :b :c :d]
|
||||
:a
|
||||
[:b :c :d :e]
|
||||
"No dice!"
|
||||
()]}]
|
||||
|
||||
["04_vectors" {"__" [1
|
||||
[1]
|
||||
[nil nil]
|
||||
2
|
||||
[111 222 333]
|
||||
:peanut
|
||||
:jelly
|
||||
:jelly
|
||||
[:butter :and]
|
||||
3]}]
|
||||
|
||||
["05_sets" {"__" [[3]
|
||||
3
|
||||
#{1 2 3 4 5}
|
||||
#{1 2 3 4 5}
|
||||
#{2 3}
|
||||
#{1 4}]}]
|
||||
|
||||
["06_maps" {"__" [:b 2
|
||||
1
|
||||
2
|
||||
2
|
||||
1
|
||||
1
|
||||
"Sochi"
|
||||
nil
|
||||
:key-not-found
|
||||
true
|
||||
false
|
||||
"February"
|
||||
1 "January"
|
||||
2010 2014 2018
|
||||
"PyeongChang" "Sochi" "Vancouver"]}]
|
||||
|
||||
["07_functions" {"__" [81
|
||||
20
|
||||
10
|
||||
60
|
||||
15
|
||||
30]
|
||||
"___" [+
|
||||
*
|
||||
(fn [f] (f 5))
|
||||
(fn [f] (f 5))]}]
|
||||
|
||||
["08_conditionals" {"__" [:a
|
||||
[]
|
||||
nil
|
||||
:glory
|
||||
4 6 :your-road
|
||||
1
|
||||
:bicycling
|
||||
"is that even exercise?"]}]
|
||||
|
||||
["09_higher_order_functions" {"__" [4 8 12
|
||||
(* x x)
|
||||
[false false true false false]
|
||||
()
|
||||
[:anything :goes :here]
|
||||
(< x 31)
|
||||
(* 10 x) (< x 4)
|
||||
24
|
||||
100
|
||||
(count a) (count b)]}]
|
||||
|
||||
["10_runtime_polymorphism" {"__" [(str (:name a) " eats veggies.")
|
||||
(str (:name a) " eats animals.")
|
||||
(str "I don't know what " (:name a) " eats.")
|
||||
"Hello World!"
|
||||
"Hello, you silly world."
|
||||
"Hello to this group: Peter, Paul, Mary!" ]}]
|
||||
|
||||
["11_lazy_sequences" {"__" [[1 2 3 4]
|
||||
[0 1 2 3 4]
|
||||
10
|
||||
95
|
||||
(range 20)
|
||||
:a]
|
||||
"___" [(fn [x] x)]}]
|
||||
|
||||
["12_sequence_comprehensions" {"__" [[0 1 2 3 4 5]
|
||||
(* x x)
|
||||
(range 10)
|
||||
(odd? x) (* x x)
|
||||
[row column]
|
||||
]}]
|
||||
|
||||
["13_creating_functions" {"__" [true false true
|
||||
4
|
||||
:a :b :c :d
|
||||
:c :d
|
||||
4
|
||||
8]
|
||||
"___" [(complement nil?)
|
||||
multiply-by-5
|
||||
(comp dec square)]}]
|
||||
|
||||
["14_recursion" {"__" [true
|
||||
acc
|
||||
(loop [coll coll
|
||||
acc ()]
|
||||
(if (seq coll)
|
||||
(recur (rest coll) (conj acc (first coll)))
|
||||
acc))
|
||||
(loop [n n
|
||||
acc 1]
|
||||
(if (zero? n)
|
||||
acc
|
||||
(recur (dec n) (* acc n))))]
|
||||
"___" [not]}]
|
||||
|
||||
["15_destructuring" {"__" [":bar:foo"
|
||||
(format (str "An Oxford comma list of %s, "
|
||||
"%s, "
|
||||
"and %s.")
|
||||
a b c)
|
||||
(apply str
|
||||
(interpose " "
|
||||
(apply list
|
||||
first-name
|
||||
last-name
|
||||
(interleave (repeat "aka") aliases))))
|
||||
{:original-parts full-name
|
||||
:named-parts {:first first-name :last last-name}}
|
||||
(str street-address ", " city ", " state)
|
||||
city state
|
||||
(str street-address ", " city ", " state)]
|
||||
"___" [(fn [[fname lname]
|
||||
{:keys [street-address city state]}]
|
||||
(str fname " " lname ", "
|
||||
street-address ", " city ", " state))
|
||||
]}]
|
||||
|
||||
["16_refs" {"__" ["hello"
|
||||
"hello"
|
||||
"better"
|
||||
"better!!!"
|
||||
(dosync (ref-set the-world 0))
|
||||
(map :jerry [@the-world @bizarro-world])
|
||||
]
|
||||
"___" [(fn [x] (+ 20 x))]}]
|
||||
|
||||
["17_atoms" {"__" [0
|
||||
1
|
||||
(swap! atomic-clock (partial + 4))
|
||||
20
|
||||
20
|
||||
atomic-clock 20 :fin
|
||||
]}]
|
||||
|
||||
["18_macros" {"__" [~(first form)
|
||||
~(nth form 2)
|
||||
form
|
||||
(drop 2 form)
|
||||
"Hello, Macros!"
|
||||
10
|
||||
'(+ 9 1)
|
||||
'(* 10 2)
|
||||
'(+ 10 (2 * 3))]}]
|
||||
|
||||
["19_datatypes" {"__" [(print
|
||||
(str "You're really the "
|
||||
(.category this)
|
||||
", " recipient "... sorry."))
|
||||
"peace"
|
||||
"literature"
|
||||
"physics"
|
||||
nil
|
||||
[true false]
|
||||
(str "Congratulations on your Best Picture Oscar, "
|
||||
"Evil Alien Conquerors!")]}]
|
||||
|
||||
["20_java_interop" {"__" [java.lang.String
|
||||
"SELECT * FROM"
|
||||
10
|
||||
1024
|
||||
]
|
||||
"___" [#(.toUpperCase %)
|
||||
]
|
||||
}]
|
||||
["21_partition" {"__" [partition
|
||||
[:a :b :c]
|
||||
'((0 1 2) (3 4))
|
||||
5
|
||||
:hello
|
||||
(6 :these :are)
|
||||
]}]
|
||||
["22_group_by" {"__" [odd?
|
||||
{5 ["hello" "world"] 3 ["foo" "bar"]}
|
||||
{1 [{:name "Bob" :id 1}
|
||||
{:last-name "Smith" :id 1}]
|
||||
2 [{:name "Jennifer" :id 2}]}
|
||||
nil
|
||||
{:naughty-list [{:name "Jimmy" :bad true}
|
||||
{:name "Joe" :bad true}]
|
||||
:nice-list [{:name "Jane" :bad false}]}]}]
|
||||
["23_meta" {"__" [{:league "National League"}
|
||||
{:division "West"}
|
||||
"This doesn't implement the IObj interface"
|
||||
{:foo :bar}
|
||||
nil
|
||||
\C
|
||||
inc
|
||||
:park "AT&T Park"
|
||||
'Giants
|
||||
"Giants"]}]
|
||||
]
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
mkdir -p releases
|
||||
lein1 deps
|
||||
zip -r releases/clojure-koans-`date +"%Y-%m-%d_%H-%M"`.zip \
|
||||
. \
|
||||
-x "./.idea/*" \
|
||||
-x "./.lein-plugins/*" \
|
||||
-x "./.git/*" \
|
||||
-x "releases/*"
|
||||
|
||||
echo
|
||||
echo "Don't forget to upload the zipfile (somewhere...)"
|
||||
echo `ls -t releases/clojure-koans-*.zip | head -n1`
|
||||
echo "git push"
|
||||
echo "git push --tags"
|
||||
echo
|
||||
|
||||
12
script/repl
12
script/repl
|
|
@ -1,12 +0,0 @@
|
|||
#!/bin/sh
|
||||
CLASSPATH=src
|
||||
|
||||
for f in lib/*.jar lib/dev/*.jar resources/; do
|
||||
CLASSPATH=$CLASSPATH:$f
|
||||
done
|
||||
|
||||
if [ "$OSTYPE" = "cygwin" ]; then
|
||||
CLASSPATH=`cygpath -wp $CLASSPATH`
|
||||
fi
|
||||
|
||||
java -Xmx1G -cp $CLASSPATH jline.ConsoleRunner clojure.main
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
@echo off
|
||||
setLocal EnableDelayedExpansion
|
||||
|
||||
set CLASSPATH="
|
||||
for %%j in (".\lib\*.jar") do (
|
||||
set CLASSPATH=!CLASSPATH!;%%~fj
|
||||
)
|
||||
set CLASSPATH=!CLASSPATH!"
|
||||
set CLASSPATH=%CLASSPATH%;src;resources
|
||||
|
||||
set JLINE=jline.ConsoleRunner
|
||||
|
||||
java -Xmx1G -cp %CLASSPATH% %JLINE% clojure.main
|
||||
|
||||
13
script/run
13
script/run
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/sh
|
||||
CLASSPATH=src
|
||||
|
||||
for f in lib/*.jar lib/dev/*.jar resources/; do
|
||||
CLASSPATH=$CLASSPATH:$f
|
||||
done
|
||||
|
||||
if [ "$OSTYPE" = "cygwin" ]; then
|
||||
CLASSPATH=`cygpath -wp $CLASSPATH`
|
||||
fi
|
||||
|
||||
java -cp "$CLASSPATH" clojure.main script/run.clj
|
||||
echo
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
@echo off
|
||||
setLocal EnableDelayedExpansion
|
||||
|
||||
set CLASSPATH="
|
||||
for %%j in (".\lib\*.jar", ".\lib\dev\*.jar") do (
|
||||
set CLASSPATH=!CLASSPATH!;%%~fj
|
||||
)
|
||||
set CLASSPATH=!CLASSPATH!"
|
||||
set CLASSPATH=%CLASSPATH%;src;resources
|
||||
|
||||
java -Xmx1G -cp %CLASSPATH% clojure.main script\run.clj
|
||||
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
(require 'koan-engine.runner)
|
||||
(koan-engine.runner/exec "run")
|
||||
14
script/test
14
script/test
|
|
@ -1,14 +0,0 @@
|
|||
#!/bin/sh
|
||||
CLASSPATH=src
|
||||
|
||||
|
||||
for f in lib/*.jar lib/dev/*.jar resources/; do
|
||||
CLASSPATH=$CLASSPATH:$f
|
||||
done
|
||||
|
||||
if [ "$OSTYPE" = "cygwin" ]; then
|
||||
CLASSPATH=`cygpath -wp $CLASSPATH`
|
||||
fi
|
||||
|
||||
java -cp "$CLASSPATH" clojure.main script/test.clj
|
||||
echo
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
@echo off
|
||||
setLocal EnableDelayedExpansion
|
||||
|
||||
set CLASSPATH="
|
||||
for %%j in (".\lib\*.jar", ".\lib\dev\*.jar") do (
|
||||
set CLASSPATH=!CLASSPATH!;%%~fj
|
||||
)
|
||||
set CLASSPATH=!CLASSPATH!"
|
||||
set CLASSPATH=%CLASSPATH%;src;resources
|
||||
|
||||
java -Xmx1G -cp %CLASSPATH% clojure.main script\test.clj
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
(require 'koan-engine.runner)
|
||||
(koan-engine.runner/exec "test")
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
(ns koans.01-equalities
|
||||
(:require [koan-engine.core :refer :all]))
|
||||
|
||||
(meditations
|
||||
"We shall contemplate truth by testing reality, via equality"
|
||||
(= __ true)
|
||||
|
||||
"To understand reality, we must compare our expectations against reality"
|
||||
(= __ (+ 1 1))
|
||||
|
||||
"You can test equality of many things"
|
||||
(= (+ 3 4) 7 (+ 2 __))
|
||||
|
||||
"Some things may appear different, but be the same"
|
||||
(= __ (= 2 2/1))
|
||||
|
||||
"You cannot generally float to heavens of integers"
|
||||
(= __ (= 2 2.0))
|
||||
|
||||
"But a looser equality is also possible"
|
||||
(= __ (== 2.0 2))
|
||||
|
||||
"Something is not equal to nothing"
|
||||
(= __ (not (= 1 nil)))
|
||||
|
||||
"Strings, and keywords, and symbols: oh my!"
|
||||
(= __ (= "hello" :hello 'hello))
|
||||
|
||||
"Make a keyword with your keyboard"
|
||||
(= :hello (keyword __))
|
||||
|
||||
"Symbolism is all around us"
|
||||
(= 'hello (symbol __))
|
||||
|
||||
"When things cannot be equal, they must be different"
|
||||
(not= :fill-in-the-blank __))
|
||||
Loading…
Reference in a new issue