✨ support nasal module
This commit is contained in:
parent
d9cf9ff49e
commit
d479f13a5c
2
makefile
2
makefile
|
@ -170,7 +170,7 @@ test:nasal
|
|||
@ ./nasal -d test/life.nas
|
||||
@ ./nasal -t test/loop.nas
|
||||
@ ./nasal -t test/mandelbrot.nas
|
||||
@ ./nasal -t test/md5.nas
|
||||
@ ./nasal -t test/md5_self.nas
|
||||
@ ./nasal -t -d test/md5compare.nas
|
||||
@ ./nasal -d test/module_test.nas
|
||||
@ ./nasal -e test/nasal_test.nas
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
var libkey=func(){
|
||||
var lib=dylib.dlopen("libkey"~(os.platform()=="windows"?".dll":".so"));
|
||||
var kb=lib.nas_kbhit;
|
||||
var gt=lib.nas_getch;
|
||||
var nb=lib.nas_noblock;
|
||||
var call=dylib.limitcall(0);
|
||||
return {
|
||||
kbhit:func(){return call(kb);},
|
||||
getch:func(){return call(gt);},
|
||||
nonblock:func(){return call(nb);}
|
||||
}
|
||||
}();
|
||||
|
||||
var lib=dylib.dlopen("libkey"~(os.platform()=="windows"?".dll":".so"));
|
||||
var kb=lib.nas_kbhit;
|
||||
var gt=lib.nas_getch;
|
||||
var nb=lib.nas_noblock;
|
||||
var call=dylib.limitcall(0);
|
||||
|
||||
var kbhit = func(){return call(kb);}
|
||||
var getch = func(){return call(gt);}
|
||||
var nonblock = func(){return call(nb);}
|
||||
|
|
|
@ -1,62 +1,61 @@
|
|||
var libmat=func(){
|
||||
var dl=dylib.dlopen("libmat."~(os.platform()=="windows"?"dll":"so"));
|
||||
var vec2=dl.nas_vec2;
|
||||
var vec3=dl.nas_vec3;
|
||||
var (vec2add,vec2sub,vec2mul,vec2div,vec2neg,vec2norm,vec2len,vec2dot)=(
|
||||
dl.nas_vec2_add,
|
||||
dl.nas_vec2_sub,
|
||||
dl.nas_vec2_mult,
|
||||
dl.nas_vec2_div,
|
||||
dl.nas_vec2_neg,
|
||||
dl.nas_vec2_norm,
|
||||
dl.nas_vec2_len,
|
||||
dl.nas_vec2_dot
|
||||
);
|
||||
var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=(
|
||||
dl.nas_vec3_add,
|
||||
dl.nas_vec3_sub,
|
||||
dl.nas_vec3_mult,
|
||||
dl.nas_vec3_div,
|
||||
dl.nas_vec3_neg,
|
||||
dl.nas_vec3_norm,
|
||||
dl.nas_vec3_len,
|
||||
dl.nas_vec3_dot
|
||||
);
|
||||
var (rotate_x,rotate_y,rotate_z)=(
|
||||
dl.nas_rotate_x,
|
||||
dl.nas_rotate_y,
|
||||
dl.nas_rotate_z
|
||||
);
|
||||
var (invoke_i,invoke_ii,invoke_iii)=(
|
||||
dylib.limitcall(1),
|
||||
dylib.limitcall(2),
|
||||
dylib.limitcall(3)
|
||||
);
|
||||
return {
|
||||
vec2:{
|
||||
new: func(x,y){return invoke_ii(vec2,x,y);},
|
||||
add: func(v0,v1){return invoke_ii(vec2add,v0,v1);},
|
||||
sub: func(v0,v1){return invoke_ii(vec2sub,v0,v1);},
|
||||
mul: func(v0,v1){return invoke_ii(vec2mul,v0,v1);},
|
||||
div: func(v0,v1){return invoke_ii(vec2div,v0,v1);},
|
||||
neg: func(v0){return invoke_i(vec2neg,v0);},
|
||||
norm: func(v0){return invoke_i(vec2norm,v0);},
|
||||
len: func(v0){return invoke_i(vec2len,v0);},
|
||||
dot: func(v0,v1){return invoke_ii(vec2dot,v0,v1);}
|
||||
},
|
||||
vec3:{
|
||||
new: func(x,y,z){return invoke_iii(vec3,x,y,z);},
|
||||
add: func(v0,v1){return invoke_ii(vec3add,v0,v1);},
|
||||
sub: func(v0,v1){return invoke_ii(vec3sub,v0,v1);},
|
||||
mul: func(v0,v1){return invoke_ii(vec3mul,v0,v1);},
|
||||
div: func(v0,v1){return invoke_ii(vec3div,v0,v1);},
|
||||
neg: func(v0){return invoke_i(vec3neg,v0);},
|
||||
norm: func(v0){return invoke_i(vec3norm,v0);},
|
||||
len: func(v0){return invoke_i(vec3len,v0);},
|
||||
rx: func(v0,angle){return invoke_ii(rotate_x,v0,angle);},
|
||||
ry: func(v0,angle){return invoke_ii(rotate_y,v0,angle);},
|
||||
rz: func(v0,angle){return invoke_ii(rotate_z,v0,angle);},
|
||||
dot: func(v0,v1){return invoke_ii(vec3dot,v0,v1);}
|
||||
}
|
||||
};
|
||||
}();
|
||||
|
||||
var dl=dylib.dlopen("libmat."~(os.platform()=="windows"?"dll":"so"));
|
||||
var vec2=dl.nas_vec2;
|
||||
var vec3=dl.nas_vec3;
|
||||
var (vec2add,vec2sub,vec2mul,vec2div,vec2neg,vec2norm,vec2len,vec2dot)=(
|
||||
dl.nas_vec2_add,
|
||||
dl.nas_vec2_sub,
|
||||
dl.nas_vec2_mult,
|
||||
dl.nas_vec2_div,
|
||||
dl.nas_vec2_neg,
|
||||
dl.nas_vec2_norm,
|
||||
dl.nas_vec2_len,
|
||||
dl.nas_vec2_dot
|
||||
);
|
||||
var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=(
|
||||
dl.nas_vec3_add,
|
||||
dl.nas_vec3_sub,
|
||||
dl.nas_vec3_mult,
|
||||
dl.nas_vec3_div,
|
||||
dl.nas_vec3_neg,
|
||||
dl.nas_vec3_norm,
|
||||
dl.nas_vec3_len,
|
||||
dl.nas_vec3_dot
|
||||
);
|
||||
var (rotate_x,rotate_y,rotate_z)=(
|
||||
dl.nas_rotate_x,
|
||||
dl.nas_rotate_y,
|
||||
dl.nas_rotate_z
|
||||
);
|
||||
var (invoke_i,invoke_ii,invoke_iii)=(
|
||||
dylib.limitcall(1),
|
||||
dylib.limitcall(2),
|
||||
dylib.limitcall(3)
|
||||
);
|
||||
|
||||
var vec2={
|
||||
new: func(x,y){return invoke_ii(vec2,x,y);},
|
||||
add: func(v0,v1){return invoke_ii(vec2add,v0,v1);},
|
||||
sub: func(v0,v1){return invoke_ii(vec2sub,v0,v1);},
|
||||
mul: func(v0,v1){return invoke_ii(vec2mul,v0,v1);},
|
||||
div: func(v0,v1){return invoke_ii(vec2div,v0,v1);},
|
||||
neg: func(v0){return invoke_i(vec2neg,v0);},
|
||||
norm: func(v0){return invoke_i(vec2norm,v0);},
|
||||
len: func(v0){return invoke_i(vec2len,v0);},
|
||||
dot: func(v0,v1){return invoke_ii(vec2dot,v0,v1);}
|
||||
};
|
||||
var vec3={
|
||||
new: func(x,y,z){return invoke_iii(vec3,x,y,z);},
|
||||
add: func(v0,v1){return invoke_ii(vec3add,v0,v1);},
|
||||
sub: func(v0,v1){return invoke_ii(vec3sub,v0,v1);},
|
||||
mul: func(v0,v1){return invoke_ii(vec3mul,v0,v1);},
|
||||
div: func(v0,v1){return invoke_ii(vec3div,v0,v1);},
|
||||
neg: func(v0){return invoke_i(vec3neg,v0);},
|
||||
norm: func(v0){return invoke_i(vec3norm,v0);},
|
||||
len: func(v0){return invoke_i(vec3len,v0);},
|
||||
rx: func(v0,angle){return invoke_ii(rotate_x,v0,angle);},
|
||||
ry: func(v0,angle){return invoke_ii(rotate_y,v0,angle);},
|
||||
rz: func(v0,angle){return invoke_ii(rotate_z,v0,angle);},
|
||||
dot: func(v0,v1){return invoke_ii(vec3dot,v0,v1);}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "nasal_import.h"
|
||||
#include "symbol_finder.h"
|
||||
|
||||
linker::linker():
|
||||
show_path(false), lib_loaded(false),
|
||||
|
@ -203,6 +204,55 @@ code_block* linker::import_nasal_lib() {
|
|||
return load(tmp, files.size()-1);
|
||||
}
|
||||
|
||||
std::string linker::generate_module_name(const std::string& filename) {
|
||||
auto error_name = "error_generated@[" + filename + "]";
|
||||
auto pos = filename.find_last_of(".nas");
|
||||
if (pos==std::string::npos) {
|
||||
return error_name;
|
||||
}
|
||||
pos -= 4;
|
||||
auto split_pos = filename.find_last_of("/");
|
||||
if (split_pos==std::string::npos) {
|
||||
split_pos = filename.find_last_of("\\");
|
||||
}
|
||||
if (split_pos==std::string::npos) {
|
||||
return error_name;
|
||||
}
|
||||
return filename.substr(split_pos + 1, pos - split_pos);
|
||||
}
|
||||
|
||||
return_expr* linker::generate_module_return(code_block* block) {
|
||||
auto sf = new symbol_finder;
|
||||
auto res = new return_expr(block->get_location());
|
||||
auto value = new hash_expr(block->get_location());
|
||||
res->set_value(value);
|
||||
for(const auto& i : sf->do_find(block)) {
|
||||
auto pair = new hash_pair(block->get_location());
|
||||
pair->set_name(i.name);
|
||||
pair->set_value(new identifier(block->get_location(), i.name));
|
||||
value->add_member(pair);
|
||||
}
|
||||
delete sf;
|
||||
return res;
|
||||
}
|
||||
|
||||
definition_expr* linker::generate_module_definition(code_block* block) {
|
||||
auto def = new definition_expr(block->get_location());
|
||||
def->set_identifier(new identifier(
|
||||
block->get_location(),
|
||||
generate_module_name(block->get_location().file)));
|
||||
|
||||
auto call = new call_expr(block->get_location());
|
||||
auto func = new function(block->get_location());
|
||||
func->set_code_block(block);
|
||||
func->get_code_block()->add_expression(generate_module_return(block));
|
||||
call->set_first(func);
|
||||
call->add_call(new call_function(block->get_location()));
|
||||
|
||||
def->set_value(call);
|
||||
return def;
|
||||
}
|
||||
|
||||
code_block* linker::load(code_block* root, u16 fileindex) {
|
||||
auto tree = new code_block({0, 0, 0, 0, files[fileindex]});
|
||||
if (!lib_loaded) {
|
||||
|
@ -216,8 +266,9 @@ code_block* linker::load(code_block* root, u16 fileindex) {
|
|||
break;
|
||||
}
|
||||
auto tmp = import_regular_file((call_expr*)i);
|
||||
link(tree, tmp);
|
||||
delete tmp;
|
||||
tree->add_expression(generate_module_definition(tmp));
|
||||
// link(tree, tmp);
|
||||
// delete tmp;
|
||||
}
|
||||
// add root to the back of tree
|
||||
auto file_head = new file_info(
|
||||
|
@ -239,10 +290,5 @@ const error& linker::link(
|
|||
auto new_tree_root = load(parse.tree(), 0);
|
||||
auto old_tree_root = parse.swap(new_tree_root);
|
||||
delete old_tree_root;
|
||||
if (show_path) {
|
||||
std::clog << orange << "Linker Info" << reset << ":\n";
|
||||
std::clog << " compiled file: <" << this_file << ">\n";
|
||||
std::clog << " library path : <" << lib_path << ">\n\n";
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
#include "nasal_ast.h"
|
||||
#include "nasal_lexer.h"
|
||||
#include "nasal_parse.h"
|
||||
#include "symbol_finder.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
class linker{
|
||||
private:
|
||||
|
@ -34,9 +37,15 @@ private:
|
|||
std::string find_file(const std::string&, const span&);
|
||||
code_block* import_regular_file(call_expr*);
|
||||
code_block* import_nasal_lib();
|
||||
std::string generate_module_name(const std::string&);
|
||||
return_expr* generate_module_return(code_block*);
|
||||
definition_expr* generate_module_definition(code_block*);
|
||||
code_block* load(code_block*, u16);
|
||||
|
||||
public:
|
||||
linker();
|
||||
const error& link(parse&, const std::string&, bool);
|
||||
const std::vector<std::string>& filelist() const {return files;}
|
||||
const std::string& get_this_file() const {return this_file;}
|
||||
const std::string& get_lib_path() const {return lib_path;}
|
||||
};
|
||||
|
|
|
@ -2,13 +2,7 @@
|
|||
# ValKmjolnir 2022/6/14
|
||||
# this file is inspired by a Python lib: alive_progress
|
||||
|
||||
var process_bar={
|
||||
bar:nil,
|
||||
high_resolution_bar:nil,
|
||||
spinner:nil
|
||||
};
|
||||
|
||||
process_bar.bar=func(){
|
||||
var bar=func(){
|
||||
var bar={
|
||||
solid_triangle_right:"▶",
|
||||
hollow_triangle_right:"▷",
|
||||
|
@ -73,7 +67,7 @@ process_bar.bar=func(){
|
|||
# unix.sleep(0.001);
|
||||
# }
|
||||
# println();
|
||||
process_bar.high_resolution_bar=func(){
|
||||
var high_resolution_bar=func(){
|
||||
var block=["▏","▎","▍","▌","▋","▊","▉","█"];
|
||||
return func(length){
|
||||
return {
|
||||
|
@ -103,7 +97,7 @@ process_bar.high_resolution_bar=func(){
|
|||
};
|
||||
}();
|
||||
|
||||
process_bar.spinner=func(){
|
||||
var spinner=func(){
|
||||
var generate_scrolling_spinner=func(s){
|
||||
if(typeof(s)!="str")
|
||||
s="****";
|
||||
|
@ -241,7 +235,8 @@ process_bar.spinner=func(){
|
|||
}
|
||||
};
|
||||
}();
|
||||
process_bar.default_bar=func(name="classic",length=20){
|
||||
|
||||
var default_bar=func(name="classic",length=20){
|
||||
if(typeof(name)!="str")
|
||||
name="classic";
|
||||
if(name=="classic")
|
||||
|
@ -267,7 +262,8 @@ process_bar.default_bar=func(name="classic",length=20){
|
|||
else
|
||||
return process_bar.bar("sharp","point","bracket",length);
|
||||
}
|
||||
process_bar.default_spinner=func(name="classic",repeat=1){
|
||||
|
||||
var default_spinner=func(name="classic",repeat=1){
|
||||
if(typeof(name)!="str")
|
||||
name="classic";
|
||||
if(name=="rise")
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# queue.nas
|
||||
# valkmjolnir 2021/3/31
|
||||
var queue=func(){
|
||||
var new=func(){
|
||||
var (begin,end)=(nil,nil);
|
||||
return{
|
||||
push:func(elem){
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import.std.padding;
|
||||
import.std.process_bar;
|
||||
|
||||
var (leftpad, rightpad) = (padding.leftpad, padding.rightpad);
|
||||
|
||||
var char_ttf=[
|
||||
[" "," "," "," "," "," "],
|
||||
[" █████╗ ","██╔══██╗","███████║","██╔══██║","██║ ██║","╚═╝ ╚═╝"],
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
# Road check and auto pilot by ValKmjolnir
|
||||
import.std.fg_env;
|
||||
|
||||
var props = fg_env.props;
|
||||
var geodinfo = fg_env.geodinfo;
|
||||
var maketimer = fg_env.maketimer;
|
||||
var D2R = fg_env.D2R;
|
||||
var simulation = fg_env.simulation;
|
||||
|
||||
var dt=0.01;
|
||||
var intergral=0;
|
||||
var derivative=0;
|
||||
|
|
|
@ -24,7 +24,7 @@ var prt=func(){
|
|||
|
||||
var bfs=func(begin,end){
|
||||
var move=[[1,0],[0,1],[-1,0],[0,-1]];
|
||||
var que=queue();
|
||||
var que=queue.new();
|
||||
que.push(begin);
|
||||
map[begin[0]][begin[1]]=2;
|
||||
map[end[0]][end[1]]=0;
|
||||
|
|
|
@ -127,4 +127,4 @@ foreach(var v;training_set){
|
|||
print(v,': ',output[0].out,'\n');
|
||||
}
|
||||
|
||||
bp_example();
|
||||
mat.bp_example();
|
|
@ -2,16 +2,20 @@ import.std.padding;
|
|||
import.std.file;
|
||||
import.std.sort;
|
||||
|
||||
var source=find_all_files_with_extension("./src","cpp","h");
|
||||
var sort = sort.sort;
|
||||
|
||||
var (leftpad, rightpad) = (padding.leftpad, padding.rightpad);
|
||||
|
||||
var source=file.find_all_files_with_extension("./src","cpp","h");
|
||||
sort(source,func(a,b){return cmp(a,b)<0});
|
||||
|
||||
var lib=find_all_files_with_extension("./std","nas");
|
||||
var lib=file.find_all_files_with_extension("./std","nas");
|
||||
sort(lib,func(a,b){return cmp(a,b)<0});
|
||||
|
||||
var testfile=find_all_files_with_extension("./test","nas");
|
||||
var testfile=file.find_all_files_with_extension("./test","nas");
|
||||
sort(testfile,func(a,b){return cmp(a,b)<0});
|
||||
|
||||
var module=find_all_files_with_extension("./module","cpp","nas");
|
||||
var module=file.find_all_files_with_extension("./module","cpp","nas");
|
||||
sort(module,func(a,b){return cmp(a,b)<0});
|
||||
|
||||
var longest=func(vec...){
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
import.std.process_bar;
|
||||
import.std.padding;
|
||||
|
||||
var (leftpad, rightpad) = (padding.leftpad, padding.rightpad);
|
||||
|
||||
if(os.platform()=="windows"){
|
||||
system("chcp 65001");
|
||||
system("color");
|
||||
|
|
|
@ -2,6 +2,9 @@ import.std.sort;
|
|||
import.std.padding;
|
||||
import.std.process_bar;
|
||||
|
||||
var sort = sort.sort;
|
||||
var (leftpad, rightpad) = (padding.leftpad, padding.rightpad);
|
||||
|
||||
var mess=func(vec) {
|
||||
srand();
|
||||
var s=size(vec);
|
||||
|
|
|
@ -21,7 +21,7 @@ var hex=func(){
|
|||
|
||||
# read file
|
||||
var s=func(){
|
||||
var filename = find_all_files_with_extension("./src","cpp","h");
|
||||
var filename = file.find_all_files_with_extension("./src","cpp","h");
|
||||
if(size(runtime.argv())!=0){
|
||||
var argv=runtime.argv();
|
||||
if(argv[0]=="-h" or argv[0]=="--h"){
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import.module.libsock;
|
||||
|
||||
var socket = libsock.socket;
|
||||
|
||||
var http=func(){
|
||||
var sd=nil;
|
||||
return {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import.std.json;
|
||||
import.std.process_bar;
|
||||
|
||||
var JSON = json.JSON;
|
||||
|
||||
var ss=JSON.stringify({
|
||||
vec:[0,1,2],
|
||||
hash:{
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
import.module.libsock;
|
||||
import.std.json;
|
||||
|
||||
var JSON = json.JSON;
|
||||
var socket = libsock.socket;
|
||||
|
||||
var gettime=func(){
|
||||
return split(" ",os.time())[1];
|
||||
}
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
import.test.md5;
|
||||
import.test.md5_self;
|
||||
import.std.process_bar;
|
||||
import.std.file;
|
||||
srand();
|
||||
|
||||
var _md5 = md5_self._md5;
|
||||
|
||||
var compare=func() {
|
||||
var ch=[
|
||||
"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","+",
|
||||
|
@ -45,22 +47,22 @@ var compare=func() {
|
|||
|
||||
var filechecksum=func(){
|
||||
var files=[];
|
||||
foreach(var p;find_all_files_with_extension("./test","nas")) {
|
||||
foreach(var p;file.find_all_files_with_extension("./test","nas")) {
|
||||
append(files,"./test/"~p);
|
||||
}
|
||||
foreach(var p;find_all_files_with_extension("./std","nas")) {
|
||||
foreach(var p;file.find_all_files_with_extension("./std","nas")) {
|
||||
append(files,"./std/"~p);
|
||||
}
|
||||
foreach(var p;find_all_files_with_extension("./module","nas","cpp")) {
|
||||
foreach(var p;file.find_all_files_with_extension("./module","nas","cpp")) {
|
||||
append(files,"./module/"~p);
|
||||
}
|
||||
foreach(var p;find_all_files_with_extension(".","md")) {
|
||||
foreach(var p;file.find_all_files_with_extension(".","md")) {
|
||||
append(files,"./"~p);
|
||||
}
|
||||
foreach(var p;find_all_files_with_extension("./src","cpp","h")) {
|
||||
foreach(var p;file.find_all_files_with_extension("./src","cpp","h")) {
|
||||
append(files,"./src/"~p);
|
||||
}
|
||||
foreach(var p;find_all_files_with_extension("./doc","md")) {
|
||||
foreach(var p;file.find_all_files_with_extension("./doc","md")) {
|
||||
append(files,"./doc/"~p);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
import.std.sort;
|
||||
|
||||
var var_sort = sort.var_sort;
|
||||
var sort = sort.sort;
|
||||
|
||||
|
||||
var vec=[];
|
||||
setsize(vec, 1e4);
|
||||
rand(time(0));
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import.std.sort;
|
||||
var sort = sort.sort;
|
||||
|
||||
var to_lower=func(s){
|
||||
var tmp="";
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
|
||||
var REPS = 10;
|
||||
var COUNT = 16384;
|
||||
|
||||
print("Initializing...\n");
|
||||
var v = [];
|
||||
for(var i=0; i<COUNT; i=i+1) { append(v, {}); }
|
||||
|
||||
|
||||
print("Starting test\n");
|
||||
func {
|
||||
for(var rep=0; rep<REPS; rep+=1) {
|
||||
print(rep, "...\n");
|
||||
for(var i=0; i<COUNT; i=i+1) {
|
||||
var obj = v[i];
|
||||
obj.fielda = i;
|
||||
obj.fieldb = i;
|
||||
obj.fieldc = i;
|
||||
obj.fieldd = i;
|
||||
}
|
||||
for(var i=0; i<COUNT; i=i+1) {
|
||||
var obj = v[i];
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
|
||||
if(obj.fielda != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldb != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldc != i) { print("Ack!\n"); return; }
|
||||
if(obj.fieldd != i) { print("Ack!\n"); return; }
|
||||
}
|
||||
}
|
||||
}();
|
||||
|
||||
print("exp(1) = ", math.exp(1), "\n");
|
||||
|
||||
print("e = ", math.e, "\n");
|
||||
print("pi = ", math.pi, "\n");
|
||||
|
||||
var angle = 32 * math.pi/180;
|
||||
print("sin(32) = ", math.sin(angle), "\n");
|
||||
print("cos(32) = ", math.cos(angle), "\n");
|
||||
print("s^2 + c^s = ",
|
||||
math.sin(angle)*math.sin(angle)+math.cos(angle)*math.cos(angle), "\n");
|
||||
|
||||
func{for(var j=0; j<10; j=j+1) {
|
||||
print(j, "/10\n");
|
||||
|
||||
# Make some tables to store stuff. This will clobber the contents
|
||||
# from the previous loop, making them available for garbage
|
||||
# collection.
|
||||
var v = []; var h1 = {}; var h2 = {};
|
||||
|
||||
# Fill them
|
||||
for(var i=0; i<65536; i=i+1) {
|
||||
var str = "i" ~ i;
|
||||
append(v, str);
|
||||
h1[str] = i;
|
||||
h2[i~""] = [str];
|
||||
}
|
||||
|
||||
# Check that we get back what we put in
|
||||
for(i=0; i<65536; i=i+1) {
|
||||
if(v[i] != h2[h1[v[i]~""]~""][0]) {
|
||||
print("Ack!\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}}();
|
Loading…
Reference in New Issue