Merge pull request #1 from FrizzBolt/equalities
Remove extraneous projects files from repo. Add solutions for 01 - Equalities.
This commit is contained in:
commit
e1cc8a72b4
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