1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-21 10:37:58 +03:00
mal/matlab/core.m

122 lines
3.7 KiB
Mathematica
Raw Normal View History

2015-02-08 10:13:41 +03:00
classdef core
methods(Static)
2015-02-09 08:50:12 +03:00
function ret = throw(obj)
ret = types.nil;
throw(types.MalException(obj));
end
2015-02-08 22:18:08 +03:00
function str = pr_str(varargin)
strs = cellfun(@(s) printer.pr_str(s,true), varargin, ...
'UniformOutput', false);
str = strjoin(strs, ' ');
end
function str = do_str(varargin)
strs = cellfun(@(s) printer.pr_str(s,false), varargin, ...
'UniformOutput', false);
str = strjoin(strs, '');
end
function ret = prn(varargin)
strs = cellfun(@(s) printer.pr_str(s,true), varargin, ...
'UniformOutput', false);
fprintf('%s\n', strjoin(strs, ' '));
ret = types.nil;
end
function ret = println(varargin)
strs = cellfun(@(s) printer.pr_str(s,false), varargin, ...
'UniformOutput', false);
fprintf('%s\n', strjoin(strs, ' '));
ret = types.nil;
end
2015-02-09 09:23:10 +03:00
function ret = time_ms()
secs = now-repmat(datenum('1970-1-1 00:00:00'),size(now));
ret = floor(secs.*repmat(24*3600.0*1000,size(now)));
end
2015-02-09 04:23:49 +03:00
function ret = concat(varargin)
if nargin == 0
ret = {};
else
ret = cat(2,varargin{:});
end
end
2015-02-09 05:35:44 +03:00
function ret = first(seq)
if length(seq) < 1
ret = types.nil;
else
ret = seq{1};
end
end
function ret = nth(seq, idx)
if idx+1 > length(seq)
throw(MException('Range:nth', ...
'nth: index out of range'))
end
ret = seq{idx+1};
end
2015-02-09 08:50:12 +03:00
function ret = apply(varargin)
f = varargin{1};
if isa(f, 'types.Function')
f = f.fn;
end
first_args = varargin(2:end-1);
rest_args = varargin{end};
args = [first_args rest_args];
ret = f(args{:});
end
function ret = map(f, lst)
if isa(f, 'types.Function')
f = f.fn;
end
ret = cellfun(@(x) f(x), lst, 'UniformOutput', false);
end
2015-02-08 10:13:41 +03:00
function n = ns()
n = containers.Map();
2015-02-08 22:18:08 +03:00
n('=') = @types.equal;
2015-02-09 08:50:12 +03:00
n('throw') = @core.throw;
n('nil?') = @(a) isa(a, 'types.Nil');
n('true?') = @(a) isa(a, 'logical') && a == true;
n('false?') = @(a) isa(a, 'logical') && a == false;
n('symbol') = @(a) types.Symbol(a);
n('symbol?') = @(a) isa(a, 'types.Symbol');
2015-02-08 22:18:08 +03:00
n('pr-str') = @core.pr_str;
n('str') = @core.do_str;
n('prn') = @core.prn;
n('println') = @core.println;
2015-02-09 03:56:13 +03:00
n('read-string') = @reader.read_str;
2015-02-09 08:50:12 +03:00
n('readline') = @(p) input(p, 's');
2015-02-09 03:56:13 +03:00
n('slurp') = @fileread;
2015-02-08 10:13:41 +03:00
n('<') = @(a,b) a<b;
n('<=') = @(a,b) a<=b;
n('>') = @(a,b) a>b;
n('>=') = @(a,b) a>=b;
2015-02-08 22:18:08 +03:00
n('+') = @(a,b) a+b;
n('-') = @(a,b) a-b;
n('*') = @(a,b) a*b;
n('/') = @(a,b) floor(a/b);
2015-02-09 09:23:10 +03:00
n('time-ms') = @core.time_ms;
2015-02-08 10:13:41 +03:00
n('list') = @(varargin) varargin;
n('list?') = @iscell;
2015-02-09 04:23:49 +03:00
n('cons') = @(a,b) [{a}, b];
n('concat') = @core.concat;
2015-02-09 05:35:44 +03:00
n('nth') = @core.nth;
n('first') = @core.first;
n('rest') = @(a) a(2:end);
2015-02-08 10:13:41 +03:00
n('empty?') = @(a) length(a) == 0;
n('count') = @(a) length(a);
2015-02-09 08:50:12 +03:00
n('apply') = @core.apply;
n('map') = @core.map;
2015-02-08 10:13:41 +03:00
end
end
end