diff options
| author | Joel Martin <github@martintribe.org> | 2014-03-24 16:32:24 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-03-24 16:32:24 -0500 |
| commit | 3169070063b2cb877200117ebb384269d73bcb93 (patch) | |
| tree | 23de3db1ea5c37afd21a45b6ed7771f56a08c0c4 /docs/step_notes.txt | |
| download | mal-3169070063b2cb877200117ebb384269d73bcb93.tar.gz mal-3169070063b2cb877200117ebb384269d73bcb93.zip | |
Current state of mal for Clojure West lighting talk.
Diffstat (limited to 'docs/step_notes.txt')
| -rw-r--r-- | docs/step_notes.txt | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/docs/step_notes.txt b/docs/step_notes.txt new file mode 100644 index 0000000..768167d --- /dev/null +++ b/docs/step_notes.txt @@ -0,0 +1,181 @@ +Step Notes: + +- step0_repl + - prompt, input, READ, EVAL, PRINT, output + - readline module + - display prompt, read line of input + +- use native eval in EVAL if available + +- libedit/GNU readline: + - use existing lib, wrap shell call or implement + - load history file on first call + - add non-blank lines to history + - append to history file + +- step1_read_print + - types module: + - add boxed types if no language equivalent: + - nil, true, false, symbol, integer, string, list + - pr_str: + - stringify boxed types to their Mal representations + - list/array is recursive + - reader module: + - stateful reader object + - alternative: mutate token list + - tokenize (use regex if available) + - standard regex pattern: "/[\s,]*(~@|[\[\]{}()'`~^@]|\"(?:\\.|[^\\\"])*\"|;.*|[^\s\[\]{}('\"`,;)]*)/" + - read_str + - read_form(new Reader(tokenize(str))) + - read_form + - detect errors + - call read_list or read_atom + - read_list + - read_form until ')' + - return array (boxed) + - read_atom + - return scalar boxed type: + - nil, true, false, symbol, integer, string + +- vectors + - Basically: two array types that retain their boxed types, can be + challenging depending on the language (e.g. JS, PHP: no clean + way to derive new array types). + - types module: + - add vector boxed type + - derived from array if possible + - pr_str: + - vector is recursive + - sequential? + - reader module: + - read_vector: + - re-use read_list but with different constructor, delims + +- hash-maps + - reader module: + - re-use read_list function and apply that using hash-map + constructor + - types module: + - pr_str addition + - hash-map, map?, assoc, dissoc, get, contains?, keys, + vals (probably assoc! and dissoc! for internal) + - eval_map: eval the keys and values of hash_maps + - EVAL: + - if hash_map, call eval_map on it + +- step2_eval + - types module: + - first, rest, nth on list + - eval_ast: + - if symbol, return value of looking up in env + - if list, eval each item, return new list + - if vector support, eval each item, return new vector + - if hash_map support, eval each value, return new hash_map + - otherwise, just return unchanged ast + - EVAL/apply: + - if not a list, call eval_ast + - otherwise, apply first item to eval_ast of (rest ast) + - repl_env as simple one level assoc. array (or hash_map) + - store function as hash_map value + +- step3_env + - types module: + - Env type: + - find, set, get (no binds/exprs in constructor yet) + - may need function type if HashMap is strongly typed (e.g. Java) + - EVAL/apply: + - def! - mutate current environment + - let* - create new environment with bindings + - _ref sugar + +- step4_if_fn_do + - types module: + - function type (closure) + - add function printing to pr_str + - add binds/exprs handling to Env constructor with variable arity + - functions (exported via types_ns): + - move arith operations here + - comparison operations (including =) + - prn, pr_str, = (recursive) + - list, list?, count, empty? + - EVAL: + - do: + - if: + - fn*: + - simple if language supports closures + - define not using rep() + + +- metadata + - + +- step5_tco + - types module: + - function type: + - stores: func, exp, env, params + - func is EVAL in native mal case, otherwise reference to + platform function + - if metadata support, then store exp, env, params as + metadata + - update function printer to show function types + - EVAL: + - while loop around whole thing + - cases where we directly return result of EVAL, instead set + ast and env to what would be put in the EVAL, then loop. + - for apply case, set env to new Env based on properties + on the function + +- step6_file + - add read-string, eval, slurp, slurp-do platform wrappers + - define load-file function + - if files on command line, use load-file to run + +- step7_quote + - reader module: + - add reader macros to read_form for quote, unquote, + splice-unquote and quasiquote + - types module: + - add cons and concat functions + - add is_pair and quasiquote functions + - rewrite ast using cons/concat functions + - if vectors, use sequential? instead of list? in is_pair + - EVAL: + - add 'quote', 'quasiquote' cases + +- step8_macros + - types module: + - add first, rest functions + - add is_macro_call and macroexpand + - recursively macroexpand lists + - if applying a macro function, run it on the ast first before + continuing + - call macroexpand apply in EVAL + - EVAL: + - add 'defmacro!' and 'macroexpand' + - store ismacro property on function metadata + +- stepA_more + - types module: + - throw function + - map, apply functions + - symbol?, nil?, true?, false? + - conj, first, rest + - EVAL: + - try*/catch*: for normal exceptions, extracts string + otherwise extracts full value + - define cond and or macros using rep() + +- atoms + - reader module: + - @a reader macro -> (deref a) + - types module: + - pr_str case + - atom type, atom, atom?, deref, reset!, swap! + +- metadata + - types module: + - support meta property on symbols, hash-maps, lists, vectors, + functions, atoms + - add with-meta, meta functions + - reader module: + - ^ reader macro reads ^meta obj -> (with-meta obj meta) |
