Very rough sketch of a beginning, not even nearly doing anything interesting.

This commit is contained in:
Simon Brooke 2016-02-15 14:53:33 +00:00
parent 9fe52661f7
commit 1e989616d7
45 changed files with 1230 additions and 329 deletions

470
LICENSE
View file

@ -1,214 +1,340 @@
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC GNU GENERAL PUBLIC LICENSE
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM Version 2, June 1991
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
"Contribution" means: Preamble
a) in the case of the initial Contributor, the initial code and The licenses for most software are designed to take away your
documentation distributed under this Agreement, and freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
b) in the case of each subsequent Contributor: When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
i) changes to the Program, and To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
ii) additions to the Program; For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
where such changes and/or additions to the Program originate from and are We protect your rights with two steps: (1) copyright the software, and
distributed by that particular Contributor. A Contribution 'originates' from (2) offer you this license which gives you legal permission to copy,
a Contributor if it was added to the Program by such Contributor itself or distribute and/or modify the software.
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.
"Contributor" means any person or entity that distributes the Program. Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
"Licensed Patents" mean patent claims licensable by a Contributor which are Finally, any free program is threatened constantly by software
necessarily infringed by the use or sale of its Contribution alone or when patents. We wish to avoid the danger that redistributors of a free
combined with the Program. program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
"Program" means the Contributions distributed in accordance with this The precise terms and conditions for copying, distribution and
Agreement. modification follow.
"Recipient" means anyone who receives the Program under this Agreement, GNU GENERAL PUBLIC LICENSE
including all Contributors. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
2. GRANT OF RIGHTS 0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
a) Subject to the terms of this Agreement, each Contributor hereby grants Activities other than copying, distribution and modification are not
Recipient a non-exclusive, worldwide, royalty-free copyright license to covered by this License; they are outside its scope. The act of
reproduce, prepare derivative works of, publicly display, publicly perform, running the Program is not restricted, and the output from the Program
distribute and sublicense the Contribution of such Contributor, if any, and is covered only if its contents constitute a work based on the
such derivative works, in source code and object code form. Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
b) Subject to the terms of this Agreement, each Contributor hereby grants 1. You may copy and distribute verbatim copies of the Program's
Recipient a non-exclusive, worldwide, royalty-free patent license under source code as you receive it, in any medium, provided that you
Licensed Patents to make, use, sell, offer to sell, import and otherwise conspicuously and appropriately publish on each copy an appropriate
transfer the Contribution of such Contributor, if any, in source code and copyright notice and disclaimer of warranty; keep intact all the
object code form. This patent license shall apply to the combination of the notices that refer to this License and to the absence of any warranty;
Contribution and the Program if, at the time the Contribution is added by the and give any other recipients of the Program a copy of this License
Contributor, such addition of the Contribution causes such combination to be along with the Program.
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.
c) Recipient understands that although each Contributor grants the licenses You may charge a fee for the physical act of transferring a copy, and
to its Contributions set forth herein, no assurances are provided by any you may at your option offer warranty protection in exchange for a fee.
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.
d) Each Contributor represents that to its knowledge it has sufficient 2. You may modify your copy or copies of the Program or any portion
copyright rights in its Contribution, if any, to grant the copyright license of it, thus forming a work based on the Program, and copy and
set forth in this Agreement. distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
3. REQUIREMENTS a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
A Contributor may choose to distribute the Program in object code form under b) You must cause any work that you distribute or publish, that in
its own license agreement, provided that: whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
a) it complies with the terms and conditions of this Agreement; and c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
b) its license agreement: These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
i) effectively disclaims on behalf of all Contributors all warranties and Thus, it is not the intent of this section to claim rights or contest
conditions, express and implied, including warranties or conditions of title your rights to work written entirely by you; rather, the intent is to
and non-infringement, and implied warranties or conditions of merchantability exercise the right to control the distribution of derivative or
and fitness for a particular purpose; collective works based on the Program.
ii) effectively excludes on behalf of all Contributors all liability for In addition, mere aggregation of another work not based on the Program
damages, including direct, indirect, special, incidental and consequential with the Program (or with a work based on the Program) on a volume of
damages, such as lost profits; a storage or distribution medium does not bring the other work under
the scope of this License.
iii) states that any provisions which differ from this Agreement are offered 3. You may copy and distribute the Program (or a work based on it,
by that Contributor alone and not by any other party; and under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
iv) states that source code for the Program is available from such a) Accompany it with the complete corresponding machine-readable
Contributor, and informs licensees how to obtain it in a reasonable manner on source code, which must be distributed under the terms of Sections
or through a medium customarily used for software exchange. 1 and 2 above on a medium customarily used for software interchange; or,
When the Program is made available in source code form: b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
a) it must be made available under this Agreement; and c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
b) a copy of this Agreement must be included with each copy of the Program. The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
Contributors may not remove or alter any copyright notices contained within If distribution of executable or object code is made by offering
the Program. access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
Each Contributor must identify itself as the originator of its Contribution, 4. You may not copy, modify, sublicense, or distribute the Program
if any, in a manner that reasonably allows subsequent Recipients to identify except as expressly provided under this License. Any attempt
the originator of the Contribution. otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
4. COMMERCIAL DISTRIBUTION 5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
Commercial distributors of software may accept certain responsibilities with 6. Each time you redistribute the Program (or any work based on the
respect to end users, business partners and the like. While this license is Program), the recipient automatically receives a license from the
intended to facilitate the commercial use of the Program, the Contributor who original licensor to copy, distribute or modify the Program subject to
includes the Program in a commercial product offering should do so in a these terms and conditions. You may not impose any further
manner which does not create potential liability for other Contributors. restrictions on the recipients' exercise of the rights granted herein.
Therefore, if a Contributor includes the Program in a commercial product You are not responsible for enforcing compliance by third parties to
offering, such Contributor ("Commercial Contributor") hereby agrees to defend this License.
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 tocontrol, 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.
For example, a Contributor might include the Program in a commercial product 7. If, as a consequence of a court judgment or allegation of patent
offering, Product X. That Contributor is then a Commercial Contributor. If infringement or for any other reason (not limited to patent issues),
that Commercial Contributor then makes performance claims, or offers conditions are imposed on you (whether by court order, agreement or
warranties related to Product X, those performance claims and warranties are otherwise) that contradict the conditions of this License, they do not
such Commercial Contributor's responsibility alone. Under this section, the excuse you from the conditions of this License. If you cannot
Commercial Contributor would have to defend claims against the other distribute so as to satisfy simultaneously your obligations under this
Contributors related to those performance claims and warranties, and if a License and any other pertinent obligations, then as a consequence you
court requires any other Contributor to pay any damages as a result, the may not distribute the Program at all. For example, if a patent
Commercial Contributor must pay those damages. license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
5. NO WARRANTY If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON It is not the purpose of this section to induce you to infringe any
AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER patents or other property right claims or to contest validity of any
EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR such claims; this section has the sole purpose of protecting the
CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A integrity of the free software distribution system, which is
PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the implemented by public license practices. Many people have made
appropriateness of using and distributing the Program and assumes all risks generous contributions to the wide range of software distributed
associated with its exercise of rights under this Agreement , including but through that system in reliance on consistent application of that
not limited to the risks and costs of program errors, compliance with system; it is up to the author/donor to decide if he or she is willing
applicable laws, damage to or loss of data, programs or equipment, and to distribute software through any other system and a licensee cannot
unavailability or interruption of operations. impose that choice.
6. DISCLAIMER OF LIABILITY This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY 8. If the distribution and/or use of the Program is restricted in
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, certain countries either by patents or by copyrighted interfaces, the
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION original copyright holder who places the Program under this License
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN may add an explicit geographical distribution limitation excluding
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) those countries, so that distribution is permitted only in or among
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE countries not thus excluded. In such case, this License incorporates
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY the limitation as if written in the body of this License.
OF SUCH DAMAGES.
7. GENERAL 9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
If any provision of this Agreement is invalid or unenforceable under Each version is given a distinguishing version number. If the Program
applicable law, it shall not affect the validity or enforceability of the specifies a version number of this License which applies to it and "any
remainder of the terms of this Agreement, and without further action by the later version", you have the option of following the terms and conditions
parties hereto, such provision shall be reformed to the minimum extent either of that version or of any later version published by the Free
necessary to make such provision valid and enforceable. Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
If Recipient institutes patent litigation against any entity (including a 10. If you wish to incorporate parts of the Program into other free
cross-claim or counterclaim in a lawsuit) alleging that the Program itself programs whose distribution conditions are different, write to the author
(excluding combinations of the Program with other software or hardware) to ask for permission. For software which is copyrighted by the Free
infringes such Recipient's patent(s), then such Recipient's rights granted Software Foundation, write to the Free Software Foundation; we sometimes
under Section 2(b) shall terminate as of the date such litigation is filed. make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
All Recipient's rights under this Agreement shall terminate if it fails to NO WARRANTY
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.
Everyone is permitted to copy and distribute copies of this Agreement, but in 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
order to avoid inconsistency the Agreement is copyrighted and may only be FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
modified in the following manner. The Agreement Steward reserves the right to OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
publish new versions (including revisions) of this Agreement from time to PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
time. No one other than the Agreement Steward has the right to modify this OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Agreement. The Eclipse Foundation is the initial Agreement Steward. The MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
Eclipse Foundation may assign the responsibility to serve as the Agreement TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
Steward to a suitable separate entity. Each new version of the Agreement will PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
be given a distinguishing version number. The Program (including REPAIR OR CORRECTION.
Contributions) may always be distributed subject to the version of the
Agreement under which it was received. In addition, after a new version of 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
the Agreement is published, Contributor may elect to distribute the Program WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
(including its Contributions) under the new version. Except as expressly REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
licenses to the intellectual property of any Contributor under this OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
Agreement, whether expressly, by implication, estoppel or otherwise. All TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
rights in the Program not expressly granted under this Agreement are YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
reserved. PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{description}
Copyright (C) {year} {fullname}
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
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.

119
README.md
View file

@ -1,120 +1,5 @@
# mw3 # mw3
MW3 is intended to be a re-implementation of MicroWorld in ClojureScript: the third reimplementation, although not nearly as dramatic as the shift from C to Clojure!
## Development It is a very long way from finished and does not even nearly work yet. Come back in a month or two.
Open a terminal and type `lein repl` to start a Clojure REPL
(interactive prompt).
In the REPL, type
```clojure
(run)
(browser-repl)
```
The call to `(run)` starts the Figwheel server at port 3449, which takes care of
live reloading ClojureScript code and CSS. Figwheel's server will also act as
your app server, so requests are correctly forwarded to the http-handler you
define.
Running `(browser-repl)` starts the Weasel REPL server, and drops you into a
ClojureScript REPL. Evaluating expressions here will only work once you've
loaded the page, so the browser can connect to Weasel.
When you see the line `Successfully compiled "resources/public/app.js" in 21.36
seconds.`, you're ready to go. Browse to `http://localhost:3449` and enjoy.
**Attention: It is not needed to run `lein figwheel` separately. Instead we
launch Figwheel directly from the REPL**
## Trying it out
If all is well you now have a browser window saying 'Hello Chestnut',
and a REPL prompt that looks like `cljs.user=>`.
Open `resources/public/css/style.css` and change some styling of the
H1 element. Notice how it's updated instantly in the browser.
Open `src/cljs/mw3/core.cljs`, and change `dom/h1` to
`dom/h2`. As soon as you save the file, your browser is updated.
In the REPL, type
```
(ns mw3.core)
(swap! app-state assoc :text "Interactivity FTW")
```
Notice again how the browser updates.
### Lighttable
Lighttable provides a tighter integration for live coding with an inline
browser-tab. Rather than evaluating cljs on the command line with weasel repl,
evaluate code and preview pages inside Lighttable.
Steps: After running `(run)`, open a browser tab in Lighttable. Open a cljs file
from within a project, go to the end of an s-expression and hit Cmd-ENT.
Lighttable will ask you which client to connect. Click 'Connect a client' and
select 'Browser'. Browse to [http://localhost:3449](http://localhost:3449)
View LT's console to see a Chrome js console.
Hereafter, you can save a file and see changes or evaluate cljs code (without saving a file). Note that running a weasel server is not required to evaluate code in Lighttable.
### Emacs/Cider
Start a repl in the context of your project with `M-x cider-jack-in`.
Switch to repl-buffer with `C-c C-z` and start web and figwheel servers with
`(run)`, and weasel server with `(browser-repl`). Load
[http://localhost:3449](http://localhost:3449) on an external browser, which
connects to weasel, and start evaluating cljs inside Cider.
To run the Clojurescript tests, do
```
lein doo phantom
```
## Deploying to Heroku
This assumes you have a
[Heroku account](https://signup.heroku.com/dc), have installed the
[Heroku toolbelt](https://toolbelt.heroku.com/), and have done a
`heroku login` before.
``` sh
git init
git add -A
git commit
heroku create
git push heroku master:master
heroku open
```
## Running with Foreman
Heroku uses [Foreman](http://ddollar.github.io/foreman/) to run your
app, which uses the `Procfile` in your repository to figure out which
server command to run. Heroku also compiles and runs your code with a
Leiningen "production" profile, instead of "dev". To locally simulate
what Heroku does you can do:
``` sh
lein with-profile -dev,+production uberjar && foreman start
```
Now your app is running at
[http://localhost:5000](http://localhost:5000) in production mode.
## License
Copyright © 2016 FIXME
Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.
## Chestnut
Created with [Chestnut](http://plexus.github.io/chestnut/) 0.9.1 (3a675806).

View file

@ -1,32 +0,0 @@
# Contributor Code of Conduct
As contributors and maintainers of this project, we pledge to respect
all people who contribute through reporting issues, posting feature
requests, updating documentation, submitting pull requests or patches,
and other activities.
We are committed to making participation in this project a
harassment-free experience for everyone, regardless of level of
experience, gender, gender identity and expression, sexual
orientation, disability, personal appearance, body size, race, age, or
religion.
Examples of unacceptable behavior by participants include the use of
sexual language or imagery, derogatory comments or personal attacks,
trolling, public or private harassment, insults, or other
unprofessional conduct.
Project maintainers have the right and responsibility to remove, edit,
or reject comments, commits, code, wiki edits, issues, and other
contributions that are not aligned to this Code of Conduct. Project
maintainers who do not follow the Code of Conduct may be removed from
the project team.
Instances of abusive, harassing, or otherwise unacceptable behavior
may be reported by opening an issue or contacting one or more of the
project maintainers.
This Code of Conduct is adapted from the
[Contributor Covenant](http:contributor-covenant.org), version 1.0.0,
available at
[http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)

View file

@ -4,13 +4,14 @@
:license {:name "Eclipse Public License" :license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"} :url "http://www.eclipse.org/legal/epl-v10.html"}
:dependencies [[org.clojure/clojure "1.8.0-RC5"] :dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.7.228" :scope "provided"] [org.clojure/clojurescript "1.7.228" :scope "provided"]
[ring "1.4.0"] [ring "1.4.0"]
[ring/ring-defaults "0.1.5"] [ring/ring-defaults "0.1.5"]
[bk/ring-gzip "0.1.1"] [bk/ring-gzip "0.1.1"]
[ring.middleware.logger "0.5.0"] [ring.middleware.logger "0.5.0"]
[compojure "1.4.0"] [compojure "1.4.0"]
[prismatic/dommy "1.1.0"] ;; probably don't need both this and om in the longer term
[org.omcljs/om "1.0.0-alpha28"] [org.omcljs/om "1.0.0-alpha28"]
[environ "1.0.2"]] [environ "1.0.2"]]

View file

@ -0,0 +1,150 @@
body {
font-family: sans-serif;
font-size: larger;
}
/* ids generally in document order */
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
#main-container{
clear: both;
width:100%;
}
/* footer of the document */
#footer {
display: none;
}
#header {
width:100%;
padding: 0.25em 5% 0.25em 5%;
background-color: black;
color: white;
}
#header h1 {
background-color: transparent;
}
#nav{
margin: 0;
padding: 0;
position: fixed;
z-index: 149;
background:rgba(40,40,40,0.8);
}
#nav:hover #nav-menu {
display: inline;
}
#nav-icon {
padding: 0.25em;
}
#nav-menu {
display: none;
}
#nav ul li {
padding: 0;
margin: 0;
display: inline;
}
#nav ul li a {
color: white;
text-decoration: none;
font-weight: bold;
padding: 0.1em 0.75em;
margin: 0;
}
#nav ul li.active a { background: silver;}
li.nav-item a:hover { background: rgb( 240, 240, 240) }
li.nav-item a:active { background: gray; color: white; }
.error {
background-color: red;
color: white;
}
/* there isn't enough room on a phone display for optional elements, and
load/save isn't going to work on a phone anyway */
.nav-optional {
display: none;
}
.widget {
margin: 0;
padding: 0.25em 1em;
border: thin solid white;
}
.world {
font-size: 8pt;
}
div.error {
width: 100%;
}
form {
width: 100%;
background-color: silver;
border: thin solid silver;
}
h1 {
font-size: 300%;
}
h1, h2, h3, h4, h5 {
background-color: black;
color: white;
}
p, pre, ul, ol, dl, h1, h2, h3, h4, h5 {
width: 100%;
padding: 0.25em 1em;
}
input {
background-color: white;
}
input.submit {
background-color: green;
}
input.required:after {
content: " \*";
color: red;
}
label {
min-width: 35%;
}
label, input {
padding: 0.25em 1em;
margin: 0 0.5em;
}
label {
border-right: thin solid gray;
}
menu li {
display: inline;
}
menu li::before {
content: "|| ";
}
div.world table, div.world tr td {
padding: 0;
margin: 0;
border: none;
}

View file

@ -0,0 +1,150 @@
body {
font-family: sans-serif;
}
/* ids generally in document order */
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
#main-container{
clear: both;
/* width:100%; */
}
/* footer of the document */
#footer {
clear: both;
font-size: smaller;
padding: 0 2em;
text-align: center;
color:white;
background:rgba(196,196,196,0.95);
width: 100%;
margin: 0;
bottom:0;
position:fixed;
z-index:150;
_position:absolute;
_top:expression(eval(document.documentElement.scrollTop+
(document.documentElement.clientHeight-this.offsetHeight)));
}
#header {
width:100%;
padding: 2em 0 0.25em 0;
background-color: black;
color: white;
}
#tab-bar {
margin: 0;
width: 100%;
padding: 0.25em 10%;
position: fixed;
z-index: 149;
color: white;
background: rgba(40,40,40,0.8);
}
#tab-bar li {
padding: 0;
margin: 0;
display: inline;
color: white;
background: rgba(40,40,40,0.8);
}
#tab-bar li a {
color: white;
text-decoration: none;
font-weight: bold;
padding: 0.1em 0.75em;
margin: 0;
}
#tab-bar li.active a { background: silver;}
li.tab a:hover { background: rgb( 240, 240, 240) }
li.tab a:active { background: gray; color: white; }
.error {
background-color: red;
color: white;
}
.widget {
background-color: silver;
border: thin solid white;
margin-top: 0;
margin-bottom: 0;
}
.world {
font-size: 8pt;
}
div.error {
width: 100%;
}
form {
border: thin solid silver;
}
h1 {
font-size: 300%;
width: 100%;
margin: 0;
padding: 1em 10% 0.25em 10%;
text-decoration: none;
}
h1, h2, h3, h4, h5 {
background-color: black;
color: white;
}
div.content, form, p, pre, ul, ol, dl, menu, h2, h3, h4, h5 {
padding: 0.25em 10%;
}
input {
background-color: white;
}
input.submit {
background-color: green;
}
input.required:after {
content: " \*";
color: red;
}
label {
width: 30em;
min-width: 20em;
border-right: thin solid gray;
}
menu li {
display: inline;
}
menu li::before {
content: "|| ";
}
div.world table, div.world table tr td {
padding: 0;
margin: 0;
border-collapse: collapse;
border: none;
}
table.music-ruled tr:nth-child(odd) {
background-color: silver;
}
th, td {
text-align: left;
padding: 0 0.25em;
}

View file

@ -0,0 +1,52 @@
td.waste {
background-color: gray;
}
td.water {
background-color: blue;
}
td.pasture, td.grassland, td.meadow {
background-color: lime;
}
td.crop {
background-color: yellow;
}
td.camp, td.house, td.inn, td.market {
background-color: gray;
}
td.ploughland {
background-color: brown;
}
td.heath {
background-color: chartreuse;
}
td.scrub {
background-color: lime;
}
td.forest {
background-color: forestgreen;
}
td.climax {
background-color: olive;
}
td.fire {
background-color: orange;
}
td.error, td.plague {
background-color: red;
}
td.snow, td.ice {
background-color: white;
}

View file

@ -0,0 +1,166 @@
body {
font-family: sans-serif;
}
/* ids generally in document order */
/* Overall container div, holds all content of page. Yes, I know it shouldn't have fixed width */
#main-container{
clear: both;
width:100%;
}
/* footer of the document */
#footer {
clear: both;
font-size: smaller;
padding: 0 2em;
text-align: center;
color:white;
background:rgba(196,196,196,0.95);
width: 100%;
margin: 0;
bottom:0;
position:fixed;
z-index:150;
_position:absolute;
_top:expression(eval(document.documentElement.scrollTop+
(document.documentElement.clientHeight-this.offsetHeight)));
}
#footer:hover #credits {
font-size: normal;
}
#header {
width:100%;
padding: 0.25em 5% 0.25em 5%;
background-color: black;
color: white;
}
#header h1 {
background-color: transparent;
}
#nav{
margin: 0;
padding: 0;
position: fixed;
z-index: 149;
background:rgba(40,40,40,0.8);
}
#nav:hover #nav-menu {
display: inline;
}
#nav-icon {
padding: 0.25em;
}
#nav-menu {
display: none;
}
#nav ul li {
padding: 0;
margin: 0;
display: inline;
}
#nav ul li a {
color: white;
text-decoration: none;
font-weight: bold;
padding: 0.1em 0.75em;
margin: 0;
}
#nav ul li.active a { background: silver;}
li.nav-item a:hover { background: rgb( 240, 240, 240) }
li.nav-item a:active { background: gray; color: white; }
.error {
background-color: red;
color: white;
}
/* there isn't enough room on a tablet display for optional elements, and
load/save isn't going to work on a tablet anyway */
.nav-optional {
display: none;
}
.widget {
margin: 0;
padding: 0.25em 1em;
border: thin solid white;
}
.world {
font-size: 8pt;
}
div.error {
width: 100%;
}
form {
width: 100%;
background-color: silver;
border: thin solid silver;
}
h1 {
font-size: 300%;
}
h1, h2, h3, h4, h5 {
background-color: black;
color: white;
}
p, pre, ul, ol, dl, h1, h2, h3, h4, h5 {
width: 100%;
padding: 0.25em 1em;
}
input {
background-color: white;
}
input.submit {
background-color: green;
}
input.required:after {
content: " \*";
color: red;
}
label {
min-width: 35%;
}
label, input {
padding: 0.25em 1em;
margin: 0 0.5em;
}
label {
border-right: thin solid gray;
}
menu li {
display: inline;
}
menu li::before {
content: "|| ";
}
div.world table, div.world tr td {
padding: 0;
margin: 0;
border: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

View file

@ -4,9 +4,360 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/style.css" rel="stylesheet" type="text/css"> <link href="css/style.css" rel="stylesheet" type="text/css">
<link href="css/phone.css" media="only screen and (max-device-width: 480px)" rel="stylesheet" type="text/css" />
<link href="css/tablet.css" media="only screen and (min-device-width: 481px) and (max-device-width: 1024px)" rel="stylesheet" type="text/css" />
<link href="css/standard.css" media="screen and (min-device-width: 1025px)" rel="stylesheet" type="text/css" />
<link href="css/states.css" rel="stylesheet" type="text/css" />
<title>Welcome to MicroWorld!</title>
</head> </head>
<body> <body>
<div id="app"></div> <ul id="tab-bar">
<li class="tab" id="home-tab" onclick="core.home()">
Home
</li>
<li class="tab" id="params-tab" onclick="core.params()">
Params
</li>
<li class="tab" id="rules-tab" onclick="onclick.rules()">
Rules
</li>
<li class="tab" id="world-tab" onclick="onclick.world()">
World
</li>
<li class="tab" id="docs-tab" onclick="onclick.docs()">
Documentation
</li>
</ul>
<div id="home-content">
<a name="home-content"></a>
<h1>
Welcome to MicroWorld!
</h1>
<div class="content">
<h2>What this is about</h2>
<p>
<img alt="Screenshot" id="screenshot" style="float: left; padding-right: 2em;" src="img/screenshot_med.png"/>
MicroWorld is a rule driven cellular automaton. What does that mean? Well, it's a two dimensional world made up of squares called <strong>cells</strong>. The world develops in steps, and at each step, each cell is modified by applying the rules.</p>
<p><a href='world'>Go and watch</a> it running for a few moments, then come back here.</p><p>The demonstration world is a mountain, with snow at the top and the sea at the bottom. as you watched, you probably saw the bright green of grass on the lower slopes of the mountain turn to the darker green of forest. You may have seen some forest fires break out.</p>
<p>That's all controlled by rules. You make the rules. To start Noah's flood, <a href='rules'>go to the rules page</a> now, and add this rule at the very top:</p>
<pre>
if altitude is less than 200 then state should be water
</pre>
<p>then, <a href='world'>go and watch the world</a> again. What happens? You should see water spread across everywhere except the very top of the mountain. But after the flood, the waters should drain away again. Go back to <a href='rules'>rules</a> and add this rule at the very top:</p>
<pre>
if altitude is more than 9 and state is water then state should be grassland
</pre>
<p>Now the world alternates between <em>new</em> and <em>grassland</em>. That's no good! Go back to <a href='rules'>rules</a> and delete the rule that you first added - the one that says</p>
<pre>
if altitude is less than 200 then state should be water
</pre>
<p>And see! The world starts growing again.</p>
<h2>What you can do next</h2>
<h3>Change some rules</h3>
<p>Change some of the other rules and see what happens. Very likely, one of the first things that will happen is that you will get a message like this:</p>
<pre>
I did not understand 'if state is grassland then 1 chance in 10 state will be heath'
</pre>
<p>That means that you changed a rule in a way that the engine could no longer understand it. To find out what the engine will understand, have a look at the <a href='docs#grammar'>documentation</a>.</p>
<h3>Invent some rules of your own!</h3>
<p>What happens when people come into the world? Where would they make their first camp? Would they want to be near the water, so they could fish? Would they want to be near fertile grassland, to graze their sheep and cattle?</p>
<h4>Write a rule which adds some camps to the world</h4>
<p>What happens to the land around a camp? Do the people burn down forest to make new grassland? Do they convert the grassland into meadow, or into crop?</p>
<p>Does growing crops reduce the soil fertility? What makes people decide that their camp is a good enough place to build a proper house?</p>
<h4>Write some rules which describe this</h4>
<p>How many squares of meadow or crop does it take to feed each house full of people? What happens when there are too many houses and not enough fields? Can houses catch fire? What happens to a house which is next to a fire?</p>
<p>How many houses do you need for a market place? Where would people build a harbour?</p>
<h3>Change the rules completely</h3>
<p>I've provided rules which use the MicroWorld cellular automaton to make a simple model of the changes to land in Europe after the ice age. But you don't have to use it like that, at all.</p>
<p><a href='http://en.wikipedia.org/wiki/Conway's&#95;Game&#95;of&#95;Life'>Conway's Game of Life</a> is one of the famous uses of a cellular automaton. The rules for the Game of Life are very simple. To set up your game of life you'll need some initialisation rules, one for every cell you want to start live (we'll use <i>black</i> for live, and <i>white</i> for dead):</p>
<pre>
if x is equal to 4 and y is equal to 4 and state is new then state should be black</pre>
<p>Add as many of these as you need for your starting pattern. Then add a rule, after all those:</p>
<pre>
if state is new then state should be white
</pre>
<p>I'll leave you to work out what the rules of life are for yourself, from the Wiki page I linked to.</p>
<p><strong>CHEAT</strong> <i>You'll find other rule sets you can explore if you go to the <a href='params'>Parameters</a> page</i>.</p>
</div>
</div>
<div id="params-content">
<a name="params-content"></a>
<h1>
Set your parameters
</h1>
<div class="content">
<form action="{{servlet-context}}/params" method="POST">
<p class="widget">
<label for="ruleset">The rule set to use</label>
<select name="ruleset">
<option value="">No change - use your current rules</option>
{% for ruleset in rulesets %}
<option value="{{ruleset}}">{{ruleset}}</option>
{% endfor %}
</select>
</p>
<p class="widget">
<label for="heightmap">The map to use</label>
<select name="heightmap">
<option value="">No change - use your current map</option>
{% for heightmap in heightmaps %}
<option value="{{heightmap}}">{{heightmap}}</option>
{% endfor %}
</select>
</p>
<p class="widget">
<label for="pause">
Pause duration
</label>
<input id="pause" type="range" value="{{pause}}" min="0" max="60" step="5" />
</p>
<p class="help">
The pause beteen computing a new state of your world, in seconds
</p>
<p class="widget">
<label for="submit">When you have chosen your parameters</label>
<input name="submit" id="submit" type="submit" value="Save your parameters!"/>
</p>
</form>
</div>
</div>
<div id="rules-content">
<a name="rules-content"></a>
<h1>
Edit your rules
</h1>
<div class="content">
<form action="{{servlet-context}}/rules" method="POST">
<textarea name="src" id="src" rows="10" cols="80">
{{rule-text}}
</textarea>
<p class="widget">
<label for="submit">When you have finished editing</label>
<input name="submit" id="submit" type="submit" value="Save your rules"/>
</p>
</form>
</div>
</div>
<div id="world-content">
<a name="world-content"></a>
</div>
<div id="docs-content">
<a name="docs-content"></a>
<h1>
Read the documentation
</h1>
<div class="content">
<div>
<a name="top"/>
<menu>
<li><a href="#top">Top</a></li>
<li><a href="#grammar">Rule language</a></li>
<li><a href="#states">Implemented states</a></li>
<li><a href="#api">API documentation</a></li>
<li><a href="#teachers">For teachers</a></li>
</menu>
<hr/>
<div><a name="parser">&nbsp;</a></div>
{{parser|safe}}
<hr/>
<div><a name="states">&nbsp;</a></div>
<menu>
<li><a href="#top">Top</a></li>
<li><a href="#grammar">Rule language</a></li>
<li><a href="#states">Implemented states</a></li>
<li><a href="#api">API documentation</a></li>
<li><a href="#teachers">For teachers</a></li>
</menu>
<hr/>
<h2>Implemented states</h2>
<p>As it says in the rule language documentation, above, you can use
any sequence of alphanumeric characters you want as the name of a state
- you can call it whatever you like. However, if you use state
names that there aren't already tiles for, and aren't already classes
for in the CSS file, your states won't be displayed nicely in the
<a href="{{servlet-context}}/">World</a> display. The states for which
there are already tiles are:</p>
<ul>
{% for state in states %}
<li>
{{state}}
<img src="{{servlet-context}}/img/tiles/{{state}}.png"/>
</li>
{% endfor %}
</ul>
<div><a name="api">&nbsp;</a></div>
<hr/>
<menu>
<li><a href="#top">Top</a></li>
<li><a href="#grammar">Rule language</a></li>
<li><a href="#states">Implemented states</a></li>
<li><a href="#api">API documentation</a></li>
<li><a href="#teachers">For teachers</a></li>
</menu>
<hr/>
<h2>API documentation</h2>
<p>If you're adventurous you may want to modify the MicroWorld engine
itself. To do that you'll need this documentation.
<ul>
{% for component in components %}
<li>
<a href="{{servlet-context}}/docs/{{component}}/uberdoc.html">
{{component}}
</a>
</li>
{% endfor %}
</ul>
<div><a name="teachers">&nbsp;</a></div>
<hr/>
<menu>
<li><a href="#top">Top</a></li>
<li><a href="#grammar">Rule language</a></li>
<li><a href="#states">Implemented states</a></li>
<li><a href="#api">API documentation</a></li>
<li><a href="#teachers">For teachers</a></li>
</menu>
<hr/>
<h2>For teachers</h2>
<p>MicroWorld was written in the hope that it would be of use for teachers,
particularly teachers in primary schools. The reason for attempting to write
a very simple rule language was that young people would be able to create
their own rules and rule sets.</p>
<h3>Classroom setup</h3>
<p>MicroWorld will run on a Raspberry Pi, and I plan to produce a
downloadable SD card image which auto-runs it. One ideal classroom setup
would be to have one Raspberry Pi running MicroWorld to every group of
two or three children.</p>
<p>MicroWorld will also run on any ordinary PC, including Windows,
Macintosh and Linux machines. I plan to produce a packaged installer
for each operating system.</p>
<h4>Servers and clients</h4>
<p>MicroWorld is a web-app, which means it runs in a web server and the
user interface is a web browser. It would be possible to arrange a
classroom with one copy of MicroWorld on a single server, and each child's
machine running MicroWorld from that single server.</p>
<p>However, many users accessing the same server at the same time may
lead to poor performance.
Check performance on your system before introducing a class to it, and if in doubt,
running a separate copy on each machine used by children may well be more
satisfactory.</p>
<p>If many users are using the same shared machine, you should make sure
that they don't use the 'original' or 'med' versions of the Great Britain
and Ireland map - both of these are big, and performance will inevitably
be poor.</p>
<h3>Subject areas</h3>
<p>One of my main objectives in writing MicroWorld was to create a system
which would be engaging for children and would enable them to see
computing in the context of other subject areas.</p>
<h4>Geography</h4>
<p>Maps of Great Britain and Ireland, and of the Isle of Man, are included
in the distribution; however, only the 'small' version of the map of
Great Britain and Ireland is really useable, the others are too big and
will be two slow. However, you can cut a map of your local area from the
larger maps if that is helpful to your class.</p>
<p>The following rulesets are of potential use in geography teaching:</p>
<dl>
<dt>basic</dt>
<dd>A very simple ruleset which simply establishes vegetation in the
landscape. Not particularly useful in itself, but a good ruleset for
children to use as a basis for their own projects.</dd>
<dt>iceage<dt>
<dd>illustrates ice thawing gradually. Because of inadequacies in the
rule language, currently the ice retreats from north to south, which is
of course wrong for the northern hemisphere; but the principle of
retreating ice, the way in which ice retreats up mountains, and the way
in which ecosystems establish themselves.</dd>
<dt>ecology</dt>
<dd>Attempts to model the effects of browsers and predators - represented
by deer and wolves, respectively - on the landscape.</dd>
<dt>settlement</dt>
<dd>illustrates human settlement appearing first on coastal promontaries
(e.g. kitchen-midden people), gradually spreads inland (in this model as
nomadic pastoralists), and forms permanent settlements where conditions
are favourable. This helps explore why the towns in your locality are
where they are. The model is obviously simplified, but produces a
potentially useful account of settlement in at least north-western Europe
from paleolithic up to at least late bronze age. <b>Note</b> that unless
your map has at least some coastal promontaries this ruleset will need
to be modified.</dd>
<dt>
</dl>
<p>All of these rulesets are deliberately simple. This is so that
children have something to start with, but so that they can actually make
real, demonstrable improvements quite simply.</p>
<h4>History</h4>
<p>The <em>settlement</em> ruleset is probably the best starting point for
history exploration. As described above, it essentially covers only
pre-history; the development of the feudal system, for example, or of
industrialisation, are not modelled. They could be, as (more advanced)
class projects. Writing rules will enable discussion of why castles, or
mills, are positioned where they are, and what the social consequences of
these developments are.</p>
<p>You might also want to explore the conditions for the spread of epidemic
disease - such as the black death - I've provided a state for this,
but no rules.</p>
<h4>IT/Informatics</h4>
<p>Obviously, any of the rulesets but particularly the <em>life</em>
ruleset are good introduction points to informatics lessons. The rule
language is sufficiently simple that introducing children to writing
their own rules can begin almost as soon as basic literacy is
established.</p>
<p>In more advanced IT lessons, at the upper end of primary school or in
secondary schools, I would encourage you to explore modifying the engine
itself in your classes. Also, it would be interesting to write an
export program which would export MicroWorld maps to Minecraft, or
render them as explorable three dimensional spaces using
<a href="http://jmonkeyengine.org/">JMonkeyEngine</a>
or <a href="https://nightmod.net/">NightMod</a>.</p>
<h4>Art and design</h4>
<p>A number of projects, progressively more ambitious, are possible in
art and design.</p>
<ol>
<li>The tiles I've drawn are pretty basic - again, that's
intentional, children can easily produce better ones. They don't have to
be 32x32, but they do all have to be the same size.</li>
<li>The stylesheets providing the overall look and feel of the system
could be modified</li>
<li>If you have an IT project to render a 3d world, you will need 3d
models of each of the states, instead of tiles. That might be a job for
<a href="http://blender.org">Blender</a>.</li></ol>
<h3>Lesson plans</h3>
<ul>
{% for lesson in lessons %}
<li>
<a href="{{servlet-context}}/md?content=lesson-plans/{{lesson}}.md">
{{lesson}}
</a>
</li>
{% endfor %}
</ul>
<hr/>
<menu>
<li><a href="#top">Top</a></li>
<li><a href="#grammar">Rule language</a></li>
<li><a href="#states">Implemented states</a></li>
<li><a href="#api">API documentation</a></li>
<li><a href="#teachers">For teachers</a></li>
</menu>
</div>
</div>
</div>
<div id="footer">
<div id="credits">
Built with <a href="http://www.luminusweb.net/">LuminusWeb</a> ||
<img height="16" width="16" align="top" src="img/clojure-icon.gif"> Powered by <a href="http://clojure.org">Clojure</a> ||
Engineering and hosting by <a href="http://www.journeyman.cc">Journeyman</a> ||
World generated using <a href="http://git.journeyman.cc/?p=mw-engine;a=summary">MicroWorld Engine</a>
</div>
</div>
<script src="js/compiled/mw3.js" type="text/javascript"></script> <script src="js/compiled/mw3.js" type="text/javascript"></script>
</body> </body>
</html> </html>

View file

@ -1,18 +1,70 @@
(ns mw3.core (ns ^:figwheel-always mw3.core
(:require [om.core :as om :include-macros true] (:require [om.core :as om :include-macros true]
[om.dom :as dom :include-macros true])) [om.dom :as dom :include-macros true]
[cljs.core.async :refer [put! chan <!]]
[clojure.string :as string]))
(enable-console-print!) (enable-console-print!)
(defonce app-state (atom {:text "Hello Chestnut!"})) ;; The state of the application.
;; NOTE that app-state can contain vectors and maps only, not lists.
(defonce app-state (atom {:available-tabs {:#home-tab :#home-content
:#params-tab :#params-content
:#rules-tab :#rules-content
:#world-tab :#world-content
:#docs-tab :#docs-content}
:selected-tab :#home-tab
:text "Welcome to MicroWorld!"
:rules []
:params {:available-rulesets []
:available-heightmaps []
:ruleset ""
:heightmap ""}
:world []}))
(defn root-component [app owner] (deref app-state)
(:available-tabs (deref app-state))
(defn root-component [data owner]
(reify (reify
om/IRender om/IRender
(render [_] (render [_]
(dom/div nil (dom/h1 nil (:text app)))))) (dom/div nil (dom/h1 nil (:text data))))))
(defn tab-bar [data owner]
(reify
om/IInitState
(init-state [_]
{:selected-tab :#home-tab
:selected-content :#home-content})
om/IRender
(render [this]
(dmu/ul nil
)))
(def pages [:#home-content :#params-content :#rules-content :#world-content :#docs-content])
(defn onclick-handler
"Handles a click on the specified `tab` and reveals the specified `content`."
[tab content]
(doseq [page pages]
(dommy/hide!(sel page)))
(dommy/show! content))
;; NASTY! Javascript interprets hyphens as subtraction operators, so function names
;; exposed to raw Javascript (e.g. onclick event handlers) must not contain hyphens.
(defn ^:export home []
(onclick-handler :#home-tab :#home-content))
(defn ^:export params []
(onclick-handler :#params-tab :#params-content))
(om/root (om/root
root-component root-component
app-state app-state
{:target (. js/document (getElementById "app"))}) {:target (. js/document (getElementById "world-content"))})