1 function step7_quote
(varargin), main
(varargin), end
4 function ret
= READ
(str
)
5 ret
= reader.read_str
(str
);
9 function ret
= is_pair
(ast
)
10 ret
= type_utils.sequential_Q
(ast
) && length(ast
) > 0;
13 function ret
= quasiquote
(ast
)
15 ret
= types.List
(types.Symbol
('quote'), ast
);
16 elseif isa(ast.
get(1),'types.Symbol') && ...
17 strcmp(ast.
get(1).name
, 'unquote')
19 elseif is_pair
(ast.
get(1)) && ...
20 isa(ast.
get(1).
get(1),'types.Symbol') && ...
21 strcmp(ast.
get(1).
get(1).name
, 'splice-unquote')
22 ret
= types.List
(types.Symbol
('concat'), ...
23 ast.
get(1).
get(2), ...
24 quasiquote
(ast.
slice(2)));
26 ret
= types.List
(types.Symbol
('cons'), ...
27 quasiquote
(ast.
get(1)), ...
28 quasiquote
(ast.
slice(2)));
32 function ret
= eval_ast
(ast
, env
)
39 ret.append
(EVAL(ast.
get(i
), env
));
44 ret.append
(EVAL(ast.
get(i
), env
));
47 ret
= types.HashMap
();
51 ret.
set(EVAL(k
, env
), EVAL(ast.
get(k
), env
));
58 function ret
= EVAL(ast
, env
)
60 %fprintf('EVAL: %s\n', printer.pr_str(ast, true));
61 if ~type_utils.list_Q
(ast
)
62 ret
= eval_ast
(ast
, env
);
71 if isa(ast.
get(1),'types.Symbol')
72 a1sym
= ast.
get(1).name
;
78 ret
= env.
set(ast.
get(2), EVAL(ast.
get(3), env
));
82 for i
=1:2:length(ast.
get(2))
83 let_env.
set(ast.
get(2).
get(i
), EVAL(ast.
get(2).
get(i
+1), let_env
));
86 ast
= ast.
get(3); % TCO
91 ast
= quasiquote
(ast.
get(2)); % TCO
93 el
= eval_ast
(ast.
slice(2,length(ast
)-1), env
);
94 ast
= ast.
get(length(ast
)); % TCO
96 cond = EVAL(ast.
get(2), env
);
97 if strcmp(class(cond), 'types.Nil') || ...
98 (islogical
(cond) && cond == false
)
100 ast
= ast.
get(4); % TCO
102 ret
= type_utils.nil
;
106 ast
= ast.
get(3); % TCO
109 fn
= @
(varargin) EVAL(ast.
get(3), Env
({env
}, ast.
get(2), ...
110 types.List
(varargin{:})));
111 ret
= types.
Function(fn
, ast.
get(3), env
, ast.
get(2));
114 el
= eval_ast
(ast
, env
);
117 if isa(f
, 'types.Function')
118 env
= Env
({f.env
}, f.params
, args
);
121 ret
= f
(args.data
{:});
129 function ret
= PRINT(ast
)
130 ret
= printer.pr_str
(ast
, true
);
134 function ret
= rep
(str
, env
)
135 ret
= PRINT(EVAL(READ
(str
), env
));
141 % core.m: defined using matlab
142 ns
= core.ns
(); ks
= ns.keys
();
145 repl_env.
set(types.Symbol
(k
), ns
(k
));
147 repl_env.
set(types.Symbol
('eval'), @
(a
) EVAL(a
, repl_env
));
148 rest_args
= args
(2:end);
149 repl_env.
set(types.Symbol
('*ARGV*'), types.List
(rest_args
{:}));
151 % core.mal: defined using the langauge itself
152 rep
('(def! not (fn* (a) (if a false true)))', repl_env
);
153 rep
('(def! load-file (fn* (f) (eval (read-string (str "(do " (slurp f) ")")))))"', repl_env
);
156 rep
(sprintf('(load-file "%s")', args
{1}), repl_env
);
160 %cleanObj = onCleanup(@() disp('*** here1 ***'));
163 line = input('user> ', 's');
167 if strcmp(strtrim
(line),''), continue
, end
169 fprintf('%s\n', rep
(line, repl_env
));
171 fprintf('Error: %s\n', err.message
);
172 type_utils.print_stack
(err
);