📄 bfunc.java
字号:
public static final int INDEX_SCREEN_SETMODE = INDEX_DEBUG_SET + 1;
public static final int INDEX_SCREEN_SETFORMULABAR = INDEX_SCREEN_SETMODE + 1;
public static final int INDEX_FORMULABAR_REPAINT = INDEX_SCREEN_SETFORMULABAR + 1;
public static final int INDEX_SCREEN_GETMODE = INDEX_FORMULABAR_REPAINT + 1;
public static final int INDEX_SCREEN_GETFORMULABAR = INDEX_SCREEN_GETMODE + 1;
public static final int INDEX_PARSE_WS = INDEX_SCREEN_GETFORMULABAR + 1;
public static final int INDEX_CELL_CREATE_WS = INDEX_PARSE_WS + 1;
public static final int INDEX_SCREEN_SETFONT = INDEX_CELL_CREATE_WS + 1;
public static final int INDEX_SHEET_SETDEFAULTSIZE = INDEX_SCREEN_SETFONT + 1;
public static final int INDEX_HISTORY_GET = INDEX_SHEET_SETDEFAULTSIZE + 1;
public static final int INDEX_CELL_ADDRESS = INDEX_HISTORY_GET + 1;
public static final int INDEX_SHEET_ISCHANGED = INDEX_CELL_ADDRESS + 1;
public static final int INDEX_SHEET_SETCHANGED = INDEX_SHEET_ISCHANGED + 1;
public static final int INDEX_COLORS_SET = INDEX_SHEET_SETCHANGED + 1;
public static final int INDEX_QLIST = INDEX_COLORS_SET + 1;
public static final int INDEX_COLOR_RGB = INDEX_QLIST + 1;
public static final int INDEX_APP_GETPROPERTY = INDEX_COLOR_RGB + 1;
public static final int INDEXSTART_MINIMAL_SET = INDEX_APP_GETPROPERTY+1;
//#ifndef MINIMAL_SET
public static final int INDEX_QLIST_TO_SHEET = INDEXSTART_MINIMAL_SET;
public static final int INDEX_DEFMACRO = INDEX_QLIST_TO_SHEET+1;
public static final int INDEX_SEXP_GETTYPE = INDEX_DEFMACRO+1;
public static final int INDEX_SEXP_PREPROCESS = INDEX_SEXP_GETTYPE+1;
public static final int INDEX_GOLD_SET = INDEX_SEXP_PREPROCESS+1;
public static final int INDEX_THROW_ERROR = INDEX_GOLD_SET+1;
public static final int INDEXSTOP_MINIMAL_SET = INDEX_THROW_ERROR+1;
//#else
//# public static final int INDEXSTOP_MINIMAL_SET = INDEXSTART_MINIMAL_SET;
//#endif
public static final int INDEXSTART_JAVA_COMPILER = INDEXSTOP_MINIMAL_SET;
//#ifdef JAVA_COMPILER
public static final int INDEX__IF = INDEXSTART_JAVA_COMPILER;
public static final int INDEX__INCLUDE = INDEX__IF+1;
public static final int INDEXSTOP_JAVA_COMPILER = INDEX__INCLUDE+1;
//#else
//# public static final int INDEXSTOP_JAVA_COMPILER = INDEXSTART_JAVA_COMPILER;
//#endif
public void initializeNames() {
namesArray = _namesArray.getBytes();
namesArrayCount = namesArray.length;
table = new ModuleName[] {
new ModuleName(NAME_IF),
new ModuleName(NAME_WHILE),
new ModuleName(NAME_SETQ),
new ModuleName(NAME_DEFUN),
new ModuleName(NAME_SADD),
new ModuleName(NAME_SSUB),
new ModuleName(NAME_SMUL),
new ModuleName(NAME_SDIV),
new ModuleName(NAME_SGT),
new ModuleName(NAME_SGE),
new ModuleName(NAME_SLT),
new ModuleName(NAME_SLE),
new ModuleName(NAME_SEQ),
new ModuleName(NAME_SNE),
new ModuleName(NAME_LOAD),
new ModuleName(NAME_MODULE_LOAD),
new ModuleName(NAME_ISNIL),
new ModuleName(NAME_SHEET_CREATE),
new ModuleName(NAME_CELL_CREATE),
new ModuleName(NAME_REF),
new ModuleName(NAME_CURSOR_SET),
new ModuleName(NAME_CURSOR_MOVE),
new ModuleName(NAME_CURSOR_GET),
new ModuleName(NAME_SHEET_ADDCELL),
new ModuleName(NAME_CELL_GETFORMULA),
new ModuleName(NAME_CELL_SETFORMULA),
new ModuleName(NAME_CELL_GETWSFORMULA),
new ModuleName(NAME_CELL_SETWSFORMULA),
new ModuleName(NAME_SHEET_GETCELL),
new ModuleName(NAME_SEXP_PARSE),
new ModuleName(NAME_CELL_ACTIVE),
new ModuleName(NAME_SHEET_RECALCULATE),
new ModuleName(NAME_SEXP_EVALUATE),
new ModuleName(NAME_CELL_REPAINT),
new ModuleName(NAME_DATE),
new ModuleName(NAME_ROWCOLUMN),
new ModuleName(NAME_SHEET_ACTIVATE),
new ModuleName(NAME_SHEET_ACTIVE),
new ModuleName(NAME_SHEET_SAVE),
new ModuleName(NAME_SHEET_LOAD),
new ModuleName(NAME_SHEET_GETNAME),
new ModuleName(NAME_SHEET_SETNAME),
new ModuleName(NAME_SHEET_LIST),
new ModuleName(NAME_CELL_SETFORMAT),
new ModuleName(NAME_CELL_GETFORMAT),
new ModuleName(NAME_SHEET_DELETE),
new ModuleName(NAME_MESSAGE),
new ModuleName(NAME_SHEET_GETWIDTHHEIGHT),
new ModuleName(NAME_SHEET_SETWIDTHHEIGHT),
new ModuleName(NAME_SHEET_REPAINT),
new ModuleName(NAME_SELECTION_GET),
new ModuleName(NAME_SELECTION_SET),
new ModuleName(NAME_GOLD_KEY),
new ModuleName(NAME_CELL_CLEAR),
new ModuleName(NAME_REFERENCE_PROCESS),
new ModuleName(NAME_SELECTION),
new ModuleName(NAME_SETSHEETSIZE),
new ModuleName(NAME_SHEET_INSERT),
new ModuleName(NAME_CELL_GETWSVALUE),
new ModuleName(NAME_STR_GETWIDTH),
new ModuleName(NAME_CELL_COPY),
new ModuleName(NAME_CELL_COPYFROM),
new ModuleName(NAME_CELL_GETTYPE),
new ModuleName(NAME_ERROR),
new ModuleName(NAME_SYSTEM_INFO),
new ModuleName(NAME_DEBUG_SET),
new ModuleName(NAME_SCREEN_SETMODE),
new ModuleName(NAME_SCREEN_SETFORMULABAR),
new ModuleName(NAME_FORMULABAR_REPAINT),
new ModuleName(NAME_SCREEN_GETMODE),
new ModuleName(NAME_SCREEN_GETFORMULABAR),
new ModuleName(NAME_PARSE_WS),
new ModuleName(NAME_CELL_CREATE_WS),
new ModuleName(NAME_SCREEN_SETFONT),
new ModuleName(NAME_SHEET_SETDEFAULTSIZE),
new ModuleName(NAME_HISTORY_GET),
new ModuleName(NAME_CELL_ADDRESS),
new ModuleName(NAME_SHEET_ISCHANGED),
new ModuleName(NAME_SHEET_SETCHANGED),
new ModuleName(NAME_COLORS_SET),
new ModuleName(NAME_QLIST),
new ModuleName(NAME_COLOR_RGB),
new ModuleName(NAME_APP_GETPROPERTY),
//#ifndef MINIMAL_SET
new ModuleName(NAME_QLIST_TO_SHEET),
new ModuleName(NAME_DEFMACRO),
new ModuleName(NAME_SEXP_GETTYPE),
new ModuleName(NAME_SEXP_PREPROCESS),
new ModuleName(NAME_GOLD_SET),
new ModuleName(NAME_THROW_ERROR),
//#endif
//#ifdef JAVA_COMPILER
new ModuleName(NAME__IF),
new ModuleName(NAME__INCLUDE),
//#endif
};
namesCount = table.length;
}
// implementation for BFUNC, children classes must have their own implementation
public LispObject evaluate( ModuleName modulename, FunctorList sexp ) throws EvaluateException {
int size = sexp.listSize();
//#ifdef NOGUI
// CanvasHandler1 canvasHandler = null;
Sheet sheet = null;
//#else
//# CanvasHandler1 canvasHandler = CanvasHandler1.canvasHandler;
//# Sheet sheet = canvasHandler.sheet;
//#endif
// NameObject name = sexp.functor;
int optype = modulename.offset;
switch( optype ) {
// control ops
case NAME_IF:
{
if ( ((BooleanAtom)sexp.evaluateArg1()).value )
return sexp.interpretArg2();
else if( size == 4 )
return sexp.interpretArg3();
else
return NIL;
}
case NAME_WHILE:
{
while ( ((BooleanAtom)sexp.evaluateArg1()).value ) {
for (int i = 2; i < size; i++)
sexp.interpretArgN(i);
}
return NIL;
}
case NAME_SETQ:
{
NameObjectBase nm = (NameObjectBase)sexp.getArgument1();
return nm.setMappedObject(sexp.evaluateArg2());
}
case NAME_DEFUN:
//#ifndef MINIMAL_SET
case NAME_DEFMACRO:
//#endif
{
NameObjectBase funname = (NameObjectBase)sexp.getArgument1();
QuotedList local_args = sexp.getArgument2().toQuotedList();
LispObject code_body;
if(size==4)
code_body = sexp.getArgument3();
else
code_body = new QuotedList(sexp,3,size);
// create a new user function with this stuff
//#ifndef MINIMAL_SET
UserFunction fn = new UserFunction(optype==NAME_DEFMACRO,funname, local_args, code_body);
//#else
//# UserFunction fn = new UserFunction(false,funname, local_args, code_body);
//#endif
// System.out.println("Binding function: " + name);
return NIL;
}
// short math ops
case NAME_SADD:
case NAME_SSUB:
case NAME_SMUL:
case NAME_SDIV:
case NAME_SGT:
case NAME_SGE:
case NAME_SLT:
case NAME_SLE:
case NAME_SEQ:
case NAME_SNE:
{
int ff1 = sexp.getShort1();
int ff2 = sexp.getShort2();
int ff3 = 0;
boolean bb = false;
switch( optype ) {
case NAME_SADD:
ff3 = ff1 + ff2;
break;
case NAME_SSUB:
ff3 = ff1 - ff2;
break;
case NAME_SMUL:
ff3 = ff1 * ff2;
break;
case NAME_SDIV:
ff3 = ff1 / ff2;
break;
case NAME_SGT:
bb = ff1 > ff2;
break;
case NAME_SGE:
bb = ff1 >= ff2;
break;
case NAME_SLT:
bb = ff1 < ff2;
break;
case NAME_SLE:
bb = ff1 <= ff2;
break;
case NAME_SEQ:
bb = ff1 == ff2;
break;
case NAME_SNE:
bb = ff1 != ff2;
break;
}
switch( optype ) {
case NAME_SADD:
case NAME_SSUB:
case NAME_SMUL:
case NAME_SDIV:
return new ShortAtom( ff3 );
case NAME_SGT:
case NAME_SGE:
case NAME_SLT:
case NAME_SLE:
case NAME_SEQ:
case NAME_SNE:
return bb ? BooleanAtom.TRUE : BooleanAtom.FALSE;
}
}
//#ifndef MINIMAL_SET
case NAME_LOAD:
try {
return loadFile( sexp.getString1() ).interpret();
}
catch( ParseException ee ) {
throw new EvaluateException( ee.getMessage(), sexp );
}
case NAME_MODULE_LOAD:
{
/* (module-load classname:string) -> FunctionObject */
String classname = sexp.getString1();
// FIXME call initializeNames()
return ModuleHandler.getFunctionModule( classname );
}
case NAME_ISNIL:
/* (isnil LispObject) -> BooleanAtom */
return BooleanAtom.createBoolean( sexp.evaluateArg1() == NIL );
//#endif
case NAME_SHEET_CREATE:
/** (sheet-create '(columns) '(rows) '(cells)) -> sheet */
return fromList( sexp );
//#ifndef NOGUI
case NAME_SHEET_ACTIVATE:
{
/** (sheet-activate sheet) -> nil */
canvasHandler.sheet = sheet = (Sheet)sexp.evaluateArg1();;
canvasHandler.sheetInitialize();
try {
sheet.recalculateChangedCells( null );
}
catch( CircularReferenceException ee ) {
throw new EvaluateException(ee.getMessage(), sexp);
}
canvasHandler.repaint();
break;
}
//#endif
case NAME_SHEET_ACTIVE:
/** (sheet-active) -> sheet*/
return sheet;
case NAME_CELL_CREATE:
/* (cell-create i j formula format ) -> cell */
return Cell.fromList( sexp );
case NAME_CELL_CREATE_WS:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -