113 lines
No EOL
4.1 KiB
JavaScript
113 lines
No EOL
4.1 KiB
JavaScript
import { createType, error, LISPcmd } from "../lexer.js";
|
|
import { COMPUTE_TYPES, convertType } from "../types.js";
|
|
|
|
const vars = {
|
|
defvar: ({ execute, data, target, nid, ctx }) => {
|
|
let param = data[3];
|
|
let [type, d] = createType(param);
|
|
|
|
let varType = ctx.getType(data[2]);
|
|
if (varType.content) error("A variable only can be created with a primitive Type.", ...data[2].pos);
|
|
|
|
if (type == "var" || type == "code" || ctx.local) {
|
|
ctx.add({ name: data[1], vType: "V", size: varType.size, amount: 1, type: varType.type, content: 0 });
|
|
let{code,type} = vars.set({execute,data:["set", data[1], data[3]],target,nid,ctx});
|
|
return {
|
|
code: code,
|
|
type: type
|
|
}
|
|
} else {
|
|
let content = "0";
|
|
if(type == "num"){
|
|
if(Number.isInteger(d)){
|
|
content = d;
|
|
}else{
|
|
var buf = new ArrayBuffer(8);
|
|
(new Float64Array(buf))[0] = d;
|
|
let ddd = (new Uint32Array(buf));
|
|
content ="#";
|
|
content+=ddd[1].toString(16);
|
|
content+=ddd[0].toString(16);
|
|
}
|
|
}else{
|
|
content=param;
|
|
}
|
|
ctx.add({ name: data[1], vType: "V", size: varType.size, amount: 1, type: varType.type, content });
|
|
|
|
|
|
return {
|
|
code: "",
|
|
type: 0
|
|
}
|
|
}
|
|
},
|
|
set: ({ execute, data, target, nid, ctx }) => {
|
|
let toSet = ctx.find(data[1],"V");
|
|
let { code, type } = execute({ data: data[2], target });
|
|
if(ctx.local){
|
|
if (toSet.type == COMPUTE_TYPES.FLOAT) {
|
|
return {
|
|
code: `${code}
|
|
${convertType(type, toSet.type, target)}
|
|
LDOU $${target + 1},HEAPpoint
|
|
SET $${target + 2},${toSet.pos()}
|
|
${toSet.size > 4 ? "STOU" : "STSF"} $${target},$${target+1},$${target + 2}`,
|
|
type: toSet.type
|
|
};
|
|
|
|
} else {
|
|
return {
|
|
code: `${code}
|
|
${convertType(type, toSet.type, target)}
|
|
LDOU $${target + 1},HEAPpoint
|
|
SET $${target + 2},${toSet.pos()}
|
|
ST${("BWTTOOOO")[toSet.size - 1]}${toSet.type == 0 ? "U" : ""} $${target},$${target + 1},$${target + 2}`,
|
|
type: toSet.type
|
|
};
|
|
}
|
|
}else{
|
|
if (toSet.type == COMPUTE_TYPES.FLOAT) {
|
|
return {
|
|
code: `${code}
|
|
${convertType(type, toSet.type, target)}
|
|
${toSet.size > 4 ? "STOU" : "STSF"} $${target},${toSet.name}`,
|
|
type: toSet.type
|
|
};
|
|
|
|
} else {
|
|
return {
|
|
code: `${code}
|
|
${convertType(type, toSet.type, target)}
|
|
ST${("BWTTOOOO")[toSet.size - 1]}${toSet.type == 0 ? "U" : ""} $${target},${toSet.name}`,
|
|
type: toSet.type
|
|
};
|
|
}
|
|
}
|
|
},
|
|
defarr: ({ execute, data, target, nid, ctx }) => {
|
|
let param = data.array.slice(3, -1).map(d => Number(d));
|
|
|
|
let varType = ctx.getType(data[2]);
|
|
let amount = param.reduce((v, c) => v * c, 1);
|
|
|
|
ctx.add({ name: data[1], vType:"V", size: varType.size, amount: amount, type: varType.type, config: param, content: data.array.slice(-1)[0] });
|
|
|
|
return {
|
|
code: "",
|
|
type: 0
|
|
};
|
|
},
|
|
readarr: ({ execute, data, target, nid, ctx })=>{
|
|
let arr = ctx.find(data[1],"V");
|
|
if (arr.config.length > data.length - 2) error(data[1] + " is a " + arr.config.length +"dim Array. You have to provide at least this much Arguments beside the Array name!",...data[1].pos);
|
|
let params = data.array.slice(2).map((d, i) => execute({ data: d, target: target }));
|
|
return{
|
|
code:`
|
|
|
|
`,
|
|
type:arr.type
|
|
}
|
|
}
|
|
};
|
|
|
|
export default vars; |