3 function ret
= throw
(obj
)
5 if exist('OCTAVE_VERSION', 'builtin') ~
= 0
6 % Until Octave has MException objects, we need to
7 % store the error object globally to be able to pass
8 % it to the error handler.
11 exc
= struct('identifier', 'MalException:object',...
12 'message', 'MalException');
15 throw
(types.MalException
(obj
));
19 function str
= pr_str
(varargin)
20 strs
= cellfun
(@
(s
) printer.pr_str
(s
,true
), varargin, ...
21 'UniformOutput', false
);
22 str
= strjoin
(strs
, ' ');
24 function str
= do_str
(varargin)
25 strs
= cellfun
(@
(s
) printer.pr_str
(s
,false
), varargin, ...
26 'UniformOutput', false
);
27 str
= strjoin
(strs
, '');
29 function ret
= prn
(varargin)
30 strs
= cellfun
(@
(s
) printer.pr_str
(s
,true
), varargin, ...
31 'UniformOutput', false
);
32 fprintf('%s\n', strjoin
(strs
, ' '));
35 function ret
= println
(varargin)
36 strs
= cellfun
(@
(s
) printer.pr_str
(s
,false
), varargin, ...
37 'UniformOutput', false
);
38 fprintf('%s\n', strjoin
(strs
, ' '));
42 function ret
= time_ms
()
43 secs
= now
-repmat
(datenum
('1970-1-1 00:00:00'),size(now
));
44 ret
= floor(secs.
*repmat
(24*3600.0*1000,size(now
)));
47 function new_hm
= assoc
(hm
, varargin)
49 for i
=1:2:length(varargin)
50 new_hm.
set(varargin{i
}, varargin{i
+1});
54 function new_hm
= dissoc
(hm
, varargin)
56 ks
= intersect
(hm.keys
(),varargin);
57 if exist('OCTAVE_VERSION', 'builtin') ~
= 0
58 new_hm.data.remove
(ks
);
60 remove
(new_hm.data
, ks
);
64 function ret
= get(hm
, key
)
65 if isa(hm
, 'types.Nil')
67 elseif hm.data.isKey
(key
)
74 function ret
= keys
(hm
)
76 ret
= types.List
(ks
{:});
79 function ret
= vals
(hm
)
81 ret
= types.List
(vs
{:});
84 function ret
= cons
(a
, seq
)
85 cella
= [{a
}, seq.data
];
86 ret
= types.List
(cella
{:});
89 function ret
= concat
(varargin)
93 cells
= cellfun
(@
(x
) x.data
, varargin, ...
94 'UniformOutput', false
);
95 cella
= cat
(2,cells
{:});
97 ret
= types.List
(cella
{:});
100 function ret
= first
(seq
)
101 if isa(seq
, 'types.Nil')
102 ret
= type_utils.nil
;
103 elseif length(seq
) < 1
104 ret
= type_utils.nil
;
110 function ret
= rest
(seq
)
111 if isa(seq
, 'types.Nil')
114 cella
= seq.data
(2:end);
115 ret
= types.List
(cella
{:});
119 function ret
= nth
(seq
, idx
)
120 if idx
+1 > length(seq
)
121 if exist('OCTAVE_VERSION', 'builtin') ~
= 0
122 error('Range:nth', ...
123 'nth: index out of range');
125 throw
(MException
('Range:nth', ...
126 'nth: index out of range'))
129 ret
= seq.
get(idx
+1);
132 function ret
= apply
(varargin)
134 if isa(f
, 'types.Function')
137 first_args
= varargin(2:end-1);
138 rest_args
= varargin{end}.data
;
139 args
= [first_args rest_args
];
143 function ret
= map
(f
, lst
)
144 if isa(f
, 'types.Function')
147 cells
= cellfun
(@
(x
) f
(x
), lst.data
, 'UniformOutput', false
);
148 ret
= types.List
(cells
{:});
151 function ret
= conj(varargin)
153 args
= varargin(2:end);
154 if type_utils.list_Q
(seq
)
155 cella
= [fliplr
(args
), seq.data
];
156 ret
= types.List
(cella
{:});
158 cella
= [seq.data
, args
];
159 ret
= types.Vector
(cella
{:});
163 function ret
= seq
(obj
)
164 if type_utils.list_Q
(obj
)
168 ret
= type_utils.nil
;
170 elseif type_utils.vector_Q
(obj
)
172 ret
= types.List
(obj.data
{:});
174 ret
= type_utils.nil
;
176 elseif type_utils.string_Q
(obj
)
178 cells
= cellfun
(@
(c
) char(c
),...
179 num2cell
(double(obj
)),...
180 'UniformOutput', false
);
181 ret
= types.List
(cells
{:});
183 ret
= type_utils.nil
;
185 elseif isa(obj
, 'types.Nil')
186 ret
= type_utils.nil
;
188 if exist('OCTAVE_VERSION', 'builtin') ~
= 0
189 error('Type:seq', ...
190 'seq: called on non-sequence');
192 throw
(MException
('Type:seq',...
193 'seq: called on non-sequence'))
198 function new_obj
= with_meta
(obj
, meta)
199 new_obj
= clone
(obj
);
203 function meta = meta(obj
)
205 case {'types.List', 'types.Vector',
206 'types.HashMap', 'types.Function'}
209 meta = type_utils.nil
;
213 function ret
= reset_BANG
(atm
, val
)
218 function ret
= swap_BANG
(atm
, f
, varargin)
219 args
= [{atm.val
} varargin];
220 if isa(f
, 'types.Function')
223 atm.val
= f
(args
{:});
228 if exist('OCTAVE_VERSION', 'builtin') ~
= 0
231 n
= containers.Map
();
233 n
('=') = @
(a
,b
) type_utils.equal
(a
,b
);
234 n
('throw') = @
(a
) core.throw
(a
);
235 n
('nil?') = @
(a
) isa(a
, 'types.Nil');
236 n
('true?') = @
(a
) isa(a
, 'logical') && a
== true
;
237 n
('false?') = @
(a
) isa(a
, 'logical') && a
== false
;
238 n
('string?') = @
(a
) type_utils.string_Q
(a
);
239 n
('symbol') = @
(a
) types.Symbol
(a
);
240 n
('symbol?') = @
(a
) isa(a
, 'types.Symbol');
241 n
('keyword') = @
(a
) type_utils.keyword
(a
);
242 n
('keyword?') = @
(a
) type_utils.keyword_Q
(a
);
243 n
('number?') = @
(a
) type_utils.number_Q
(a
);
244 n
('fn?') = @
(a
) type_utils.fn_Q
(a
);
245 n
('macro?') = @
(a
) type_utils.macro_Q
(a
);
247 n
('pr-str') = @
(varargin) core.pr_str
(varargin{:});
248 n
('str') = @
(varargin) core.do_str
(varargin{:});
249 n
('prn') = @
(varargin) core.prn
(varargin{:});
250 n
('println') = @
(varargin) core.println
(varargin{:});
251 n
('read-string') = @
(a
) reader.read_str
(a
);
252 n
('readline') = @
(p
) input(p
, 's');
253 n
('slurp') = @
(a
) fileread
(a
);
256 n
('<=') = @
(a
,b
) a
<=b
;
258 n
('>=') = @
(a
,b
) a
>=b
;
262 n
('/') = @
(a
,b
) floor(a
/b
);
263 n
('time-ms') = @
() core.time_ms
();
265 n
('list') = @
(varargin) types.List
(varargin{:});
266 n
('list?') = @
(a
) type_utils.list_Q
(a
);
267 n
('vector') = @
(varargin) types.Vector
(varargin{:});
268 n
('vector?') = @
(a
) type_utils.vector_Q
(a
);
269 n
('hash-map') = @
(varargin) types.HashMap
(varargin{:});
270 n
('map?') = @
(a
) type_utils.hash_map_Q
(a
);
271 n
('assoc') = @
(varargin) core.assoc
(varargin{:});
272 n
('dissoc') = @
(varargin) core.dissoc
(varargin{:});
273 n
('get') = @
(a
,b
) core.
get(a
,b
);
274 n
('contains?') = @
(a
,b
) a.data.isKey
(b
);
275 n
('keys') = @
(a
) core.keys
(a
);
276 n
('vals') = @
(a
) core.vals
(a
);
278 n
('sequential?') = @
(a
) type_utils.sequential_Q
(a
);
279 n
('cons') = @
(a
,b
) core.cons
(a
,b
);
280 n
('concat') = @
(varargin) core.concat
(varargin{:});
281 n
('nth') = @
(a
,b
) core.nth
(a
,b
);
282 n
('first') = @
(a
) core.first
(a
);
283 n
('rest') = @
(a
) core.rest
(a
);
284 n
('empty?') = @
(a
) length(a
) == 0;
285 % workaround Octave always giving length(a) of 1
286 n
('count') = @
(a
) 0 + length(a
);
287 n
('apply') = @
(varargin) core.apply
(varargin{:});
288 n
('map') = @
(varargin) core.map
(varargin{:});
290 n
('conj') = @
(varargin) core.
conj(varargin{:});
291 n
('seq') = @
(a
) core.seq
(a
);
293 n
('with-meta') = @
(a
,b
) core.with_meta
(a
,b
);
294 n
('meta') = @
(a
) core.
meta(a
);
295 n
('atom') = @
(a
) types.Atom
(a
);
296 n
('atom?') = @
(a
) isa(a
, 'types.Atom');
297 n
('deref') = @
(a
) a.val
;
298 n
('reset!') = @
(a
,b
) core.reset_BANG
(a
,b
);
299 n
('swap!') = @
(varargin) core.swap_BANG
(varargin{:});