const onError = function(e) { throw(e); }
const biwa = new Interpreter(onError)
function evaluate(lisp) {
return biwa.evaluate(lisp)
}
assert_boolean = make_simple_assert("boolean", function(obj){
return typeof(obj) == 'boolean';
});
define_libfunc("goto-char", 1, 1, function(args) {
assert_integer(args[0]);
nativeGotoChar(args[0]);
return nativePoint();
});
define_libfunc("point", 0, 0, function(args) {
return nativePoint();
});
define_libfunc("buffer-size", 0, 0, function(args) {
return nativeBufferSize();
});
define_libfunc("insert", 1, 1, function(args) {
assert_string(args[0]);
nativeInsert(args[0]);
return args[0];
});
define_libfunc("load", 1, 1, function(args) {
assert_symbol(args[0]);
return nativeLoad(args[0].name);
});
define_libfunc("buffer-substring", 2, 2, function(args) {
assert_integer(args[0]);
assert_integer(args[1]);
return nativeBufferSubstring(args[0], args[1]);
});
define_libfunc("alert", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
return nativeAlert(args[0], args[1]);
});
define_libfunc("sheet-present", 1, 1, function(args) {
assert_list(args[0]);
return nativeSheetPresent(args[0].to_array());
});
define_libfunc("date-picker-present", 2, 2, function(args) {
assert_date(args[0]);
assert_boolean(args[1]);
return nativeDatePickerPresent(args[0], args[1]);
});
define_libfunc("location-get-lat-lon-start", 0, 0, function(args) {
return nativeLocationGetLatLon();
});
define_libfunc("native-current-item-set", 2, 2, function(args) {
assert_string(args[0]);
return nativeCurrentItemSet(args[0], args[1]);
});
define_libfunc("region-beginning", 0, 0, function(args) {
return nativeRegionBeginning();
});
define_libfunc("region-end", 0, 0, function(args) {
return nativeRegionEnd();
});
define_libfunc("region-set", 2, 2, function(args) {
assert_integer(args[0]);
assert_integer(args[1]);
return nativeRegionSelect(args[0], args[1]);
});
define_libfunc("delete-region", 2, 2, function(args) {
assert_integer(args[0]);
assert_integer(args[1]);
nativeDeleteRegion(args[0], args[1]);
return true;
});
define_libfunc("open-url", 1, 1, function(args) {
assert_string(args[0]);
return nativeOpenUrl(args[0]);
});
define_libfunc("pasteboard", 0, 0, function(args) {
return nativePasteboard();
})
define_libfunc("pasteboard-set!", 1, 1, function(args) {
assert_string(args[0]);
return nativePasteboardSet(args[0]);
})
define_libfunc("log-contents", 0, 0, function(args) {
return nativeLogContents();
})
define_libfunc("toast", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
nativeToast(args[0], args[1]);
return true;
});
define_libfunc("autocorrect-set!", 1, 1, function(args) {
assert_boolean(args[0]);
return nativeTypingHelp(args[0]);
})
define_libfunc("string-search-forward", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
var index = args[1].indexOf(args[0]);
return index == -1 ? false : index;
});
define_libfunc("string-search-backward", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
var index = args[1].lastIndexOf(args[0]);
return index == -1 ? false : index;
});
define_libfunc("string-contains?", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
return args[0].includes(args[1]);
});
define_libfunc("string-prefix?", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
return args[0].startsWith(args[1]);
});
define_libfunc("string-suffix?", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
return args[0].endsWith(args[1]);
});
define_libfunc("string-re-search-forward", 2, 2, function(args) {
assert_string(args[0]);
assert_string(args[1]);
var regex = RegExp(args[0]);
var result = regex.exec(args[1]);
if (result == null) {
return array_to_list([]);
} else {
var match = [];
for (i = 0 ; i < result.length ; i++) {
match.push(result[i]);
}
return array_to_list(match);
}
});
define_libfunc("string-concatenate", 1, 1, function(args) {
assert_list(args[0]);
return args[0].to_array().join("");
});
define_libfunc("log-debug", 1, 1, function(args) {
assert_string(args[0]);
return nativeLogDebug(args[0]);
});
define_libfunc("load-themes", 1, 1, function(args) {
assert_string(args[0]);
return nativeLoadThemes(args[0]);
});
// (date-adjust DATE AMOUNT DATE-KEY)
// DATE-KEY is either 'years, 'months, 'days, 'hours, 'minutes, 'seconds
define_libfunc("date-adjust", 3, 3, function(args) {
assert_date(args[0]);
assert_integer(args[1]);
assert_symbol(args[2]);
const date = dayjs(args[0]);
const amount = args[1];
const dateKey = args[2].toString().substring(1);
let jsdateKey;
switch (dateKey) {
case 'years':
jsdateKey = 'year';
break;
case 'months':
jsdateKey = 'month';
break;
case 'days':
jsdateKey = 'day';
break;
case 'hours':
jsdateKey = 'hour';
break;
case 'minutes':
jsdateKey = 'minute';
break;
case 'seconds':
jsdateKey = 'second';
break;
default:
jsdateKey = null;
}
let result;
if (jsdateKey) {
result = date.add(amount, jsdateKey);
} else {
result = date;
}
return result.toDate();
});
// (date-set DATE VALUE DATE-KEY)
// DATE-KEY is either 'years, 'months, 'days, 'hours, 'minutes, 'seconds
define_libfunc("date-set", 3, 3, function(args) {
assert_date(args[0]);
assert_integer(args[1]);
assert_symbol(args[2]);
const date = dayjs(args[0]);
const value = args[1];
const dateKey = args[2].toString().substring(1);
let result;
switch (dateKey) {
case 'year':
result = date.year(value);
break;
case 'month':
result = date.month(value - 1);
break;
case 'day':
result = date.date(value);
break;
case 'weekday':
result = date.day(value);
break;
case 'hour':
result = date.hour(value);
break;
case 'minute':
result = date.minute(value);
break;
case 'second':
result = date.second(value);
break;
default:
result = date;
}
return result.toDate();
});