print functions as #<fn name>
[jackhill/mal.git] / docs / index.html
1 <!DOCTYPE html>
2 <!--
3 Copyright (c) 2019 Joel Martin
4 Copyright (c) 2012 Fogus, Jen Myers and Relevance Inc.
5 All rights reserved. The use and distribution terms for this software
6 are covered by the Eclipse Public License 1.0
7 (http://opensource.org/licenses/eclipse-1.0.php) which can be found in
8 the file COPYING the root of this distribution. By using this
9 software in any fashion, you are agreeing to be bound by the terms of
10 this license. You must not remove this notice, or any other, from
11 this software.
12 -->
13
14 <html>
15 <head>
16 <meta charset="UTF-8" />
17 <link rel="stylesheet" type="text/css" href="web/base.css" />
18 <link rel="stylesheet" type="text/css" href="web/layout.css" />
19 <link rel="stylesheet" type="text/css" href="web/skeleton.css" />
20 <link rel="stylesheet" type="text/css" href="web/himera.css" />
21 <link rel="stylesheet" type="text/css" href="web/ansi.css" />
22 <link rel="stylesheet" type="text/css" href="web/console.css" />
23 <style type="text/css" media="screen">
24 </style>
25 <title>Mal Web REPL</title>
26 </head>
27 <body>
28 <div class="container">
29 <h1 id="title"><a href="https://github.com/kanaka/mal"/>Mal</a></h1>
30
31 <h2>Mal Web REPL</h2>
32
33 <!--
34 <div id="editor-container" class="sixteen columns">
35 <div id="tiny-note" class="tiny-note"></div>
36 <textarea class="editor" id="editor">;; Develop your Mal program here.
37 ;; Ctrl+E/Cmd+E evaluates file in the REPL.</textarea>
38 </div>
39 -->
40
41 <div id="console-container" class="sixteen columns">
42 <div class="console" id="console"></div>
43 </div>
44 <div class="eight columns">
45 <!--
46 <h3><span style="cursor: pointer" class="doc-link" id="toggle-editor">Show file editor</span></h3>
47 -->
48 <h3><span style="cursor: pointer" class="doc-link">&nbsp;</span></h3>
49 </div>
50 <div class="eight columns">
51 <div class="source">
52 <a href="http://github.com/kanaka/mal">View source on Github <img src="web/github-icon.png" /></a></p>
53 </div><!-- /source -->
54 </div>
55
56 <div class="rule sixteen columns"></div>
57
58 <div class="sixteen columns">
59 <h3>Mal at a glance</h3>
60 </div>
61
62 <div class="cheat-box-container eight columns">
63 <div class="cheat-box">
64 <h4>Datatypes</h4>
65 <table>
66 <tr class="row-one">
67 <td class="row-label">Maps</td>
68 <td>{"key1" "val1", "key2" 123}</td>
69 </tr>
70 <tr>
71 <td class="row-label">Lists</td>
72 <td>(1 2 3 "four")</td>
73 </tr>
74 <tr class="row-one">
75 <td class="row-label">Vectors</td>
76 <td>[1 2 3 4 "a" "b" "c" 1 2]</td>
77 </tr>
78 <tr>
79 <td class="row-label">Scalars</td>
80 <td>a-symbol, "a string", :a_keyword, 123, nil, true, false</td>
81 </tr>
82 </table>
83 </div><!-- /cheat-box -->
84 <div class="cheat-box">
85 <h4>Functions</h4>
86 <table>
87 <tr class="row-one">
88 <td class="row-label">Calling</td>
89 <td>(<span class="ebnf">&lt;function&gt;</span>
90 <span class="ebnf">&lt;args*&gt;</span>)</td>
91 </tr>
92 <tr>
93 <td class="row-label">Defining named functions</td>
94 <td>(def! <span class="ebnf">&lt;name&gt;</span>
95 (fn*
96 [<span class="ebnf">&lt;args*&gt;</span>]
97 <span class="ebnf">&lt;action&gt;</span>))</td>
98 </tr>
99 <tr class="row-one">
100 <td class="row-label">Anonymous function</td>
101 <td>(fn*
102 [<span class="ebnf">&lt;args*&gt;</span>]
103 <span class="ebnf">&lt;action&gt;</span>)</td>
104 </tr>
105 </table>
106 </div><!-- /cheat-box -->
107 <div class="cheat-box">
108 <h4>Useful Macros and Special Forms</h4>
109 <table>
110 <tr class="row-one">
111 <td class="row-label">Conditionals</td>
112 <td>if cond or</td>
113 </tr>
114 <!--
115 <tr>
116 <td class="row-label">Nesting, chaining, and Interop</td>
117 <td>-> ->> doto .. .</td>
118 </tr>
119 -->
120 <tr>
121 <td class="row-label">Multiple Actions (side-effects)</td>
122 <td>(do
123 <span class="ebnf">&lt;action*&gt;</span>...)</td>
124 </tr>
125 <tr class="row-one">
126 <td class="row-label">Defining things</td>
127 <td>def! defmacro! let*</td>
128 </tr>
129 <tr>
130 <td class="row-label">Quoting</td>
131 <td>' ` ~ ~@</td>
132 </tr>
133 <tr class="row-one">
134 <td class="row-label">Examining macros</td>
135 <td>macroexpand</td>
136 </tr>
137 </table>
138 </div>
139 </div><!-- /cheat-box-container -->
140
141 <div class="cheat-box-container eight columns">
142 <div class="cheat-box">
143 <h4>Useful Functions</h4>
144 <table>
145 <tr class="row-one">
146 <td class="row-label">Math</td>
147 <td>+ - * /</td>
148 </tr>
149 <tr>
150 <td class="row-label">Comparison/Boolean</td>
151 <td>= < > <= >= not</td>
152 </tr>
153 <tr class="row-one">
154 <td class="row-label">Predicates</td>
155 <td>nil? true? false? symbol? keyword? string? list? vector? map? sequential?</td>
156 </tr>
157 <tr>
158 <td class="row-label">Data processing</td>
159 <td>map apply</td>
160 </tr>
161 <tr class="row-one">
162 <td class="row-label">Data create</td>
163 <td>list vector hash-map</td>
164 </tr>
165 <tr>
166 <td class="row-label">Data inspection</td>
167 <td>first rest get keys vals count get nth contains? empty?</td>
168 </tr>
169 <tr class="row-one">
170 <td class="row-label">Data manipulation</td>
171 <td>conj cons concat assoc dissoc</td>
172 </tr>
173 <tr>
174 <td class="row-label">Lists and Vectors</td>
175 <td>first rest nth seq</td></td>
176 </tr>
177 <tr class="row-one">
178 <td class="row-label">Hash Maps</td>
179 <td>get keys vals contains?</td></td>
180 </tr>
181 <tr>
182 <td class="row-label">Strings</td>
183 <td>str pr-str seq</td></td>
184 </tr>
185 <tr class="row-one">
186 <td class="row-label">Atoms</td>
187 <td>atom atom? deref[@] reset! swap!</td></td>
188 </tr>
189 <tr>
190 <td class="row-label">Meta</td>
191 <td>meta with-meta[^]</td></td>
192 </tr>
193 <tr class="row-one">
194 <td class="row-label">Output</td>
195 <td>println prn</td></td>
196 </tr>
197 </table>
198 </div><!-- /cheat-box -->
199 <div class="cheat-box">
200 <h4>JavaScript Interop</h4>
201 <table>
202 <tr class="row-one">
203 <td class="row-label">Evaluate JavaScript</td>
204 <td>(js-eval "JS string to eval")</td>
205 </tr>
206 <tr>
207 <td class="row-label">Method call/access</td>
208 <td>(. js-fn arg...)</td>
209 </tr>
210 </table>
211 </div>
212 </div><!-- /cheat-box-container -->
213
214 <div class="rule sixteen columns"></div>
215
216 <div class="column footer-logo">
217 <div>Mal &copy; 2019 Joel Martin</div>
218 <div>Himera design &copy; 2012-2013 <a ref="http://www.fogus.me">Fogus</a>, <a href="http://jenmyers.net/">Jen Myers</a> and <a href="http://www.thinkrelevance.com">Relevance Inc.</a></div>
219 </div>
220
221 </div><!-- / container -->
222 <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
223 <script type="text/javascript" src="web/jqconsole.min.js"></script>
224 <script type="text/javascript" src="web/mal.js"></script>
225 <script>
226 $(function() {
227 // Creating the console.
228 window.jqconsole = $('#console').jqconsole(null, 'user> ');
229
230 printer.println = function () {
231 var str = Array.prototype.join.call(arguments, " ")
232 jqconsole.Write(str + "\n", 'jqconsole-output');
233 }
234
235 rep("(println (str \"Mal [\" *host-language* \"]\"))");
236
237 jq_load_history(jqconsole);
238
239 // Abort prompt on Ctrl+C.
240 jqconsole.RegisterShortcut('C', function() {
241 jqconsole.AbortPrompt();
242 handler();
243 });
244 // Move to line start Ctrl+A.
245 jqconsole.RegisterShortcut('A', function() {
246 jqconsole.MoveToStart();
247 handler();
248 });
249 // Move to line end Ctrl+E.
250 jqconsole.RegisterShortcut('E', function() {
251 jqconsole.MoveToEnd();
252 handler();
253 });
254 jqconsole.RegisterMatching('{', '}', 'brace');
255 jqconsole.RegisterMatching('(', ')', 'paren');
256 jqconsole.RegisterMatching('[', ']', 'bracket');
257 jqconsole.RegisterMatching('"', '"', 'dquote');
258 // Handle a command.
259 var handler = function(line) {
260 if (line) {
261 try {
262 jqconsole.Write(rep(line) + '\n', 'jqconsole-return');
263 } catch (exc) {
264 if (exc instanceof reader.BlankException) { return; }
265 if (exc.stack) {
266 jqconsole.Write(exc.stack + '\n', 'jqconsole-error');
267 } else {
268 jqconsole.Write(exc + '\n', 'jqconsole-error');
269 }
270 }
271 jq_save_history(jqconsole);
272 }
273 jqconsole.Prompt(true, handler);
274 /*
275 jqconsole.Prompt(true, handler, function(command) {
276 // Continue line if can't compile the command.
277 try {
278 Function(command);
279 } catch (e) {
280 if (/[\[\{\(]$/.test(command)) {
281 return 1;
282 } else {
283 return 0;
284 }
285 }
286 return false;
287 });
288 */
289 };
290
291 // Initiate the first prompt.
292 handler();
293 });
294 </script>
295
296 </body>
297 </html>