Merge pull request #611 from technomancy/eval

Add eval command
This commit is contained in:
Vadim Grigoruk 2018-07-10 14:29:05 +03:00 committed by GitHub
commit 4741ed2662
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 68 additions and 2 deletions

View File

@ -15,7 +15,10 @@ To make a retro styled game, the whole process of creation and execution takes p
![TIC-80](https://user-images.githubusercontent.com/1101448/29687467-3ddc432e-8925-11e7-8156-5cec3700cc04.gif) ![TIC-80](https://user-images.githubusercontent.com/1101448/29687467-3ddc432e-8925-11e7-8156-5cec3700cc04.gif)
### Features ### Features
- Multiple progamming languages: Lua, Moonscript, Javascript and Wren - Multiple progamming languages: [Lua](https://www.lua.org),
[Moonscript](https://moonscript.org),
[Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript),
[Wren](http://wren.io/), and [Fennel](https://fennel-lang.org).
- Games can have mouse and keyboard as input - Games can have mouse and keyboard as input
- Games can have up to 4 controllers as input - Games can have up to 4 controllers as input
- Builtin editors: for code, sprites, world maps, sound effects and music - Builtin editors: for code, sprites, world maps, sound effects and music

View File

@ -2216,6 +2216,16 @@ static void onConsoleResumeCommand(Console* console, const char* param)
resumeRunMode(); resumeRunMode();
} }
static void onConsoleEvalCommand(Console* console, const char* param)
{
printLine(console);
const tic_script_config* script_config = console->tic->api.get_script_config(console->tic);
script_config->eval(console->tic, param);
commandDone(console);
}
static void onAddFile(const char* name, AddResult result, void* data) static void onAddFile(const char* name, AddResult result, void* data)
{ {
Console* console = (Console*)data; Console* console = (Console*)data;
@ -2418,6 +2428,7 @@ static const struct
{"save", NULL, "save cart", onConsoleSaveCommand}, {"save", NULL, "save cart", onConsoleSaveCommand},
{"run", NULL, "run loaded cart", onConsoleRunCommand}, {"run", NULL, "run loaded cart", onConsoleRunCommand},
{"resume", NULL, "resume run cart", onConsoleResumeCommand}, {"resume", NULL, "resume run cart", onConsoleResumeCommand},
{"eval", "=", "run code", onConsoleEvalCommand},
{"dir", "ls", "show list of files", onConsoleDirCommand}, {"dir", "ls", "show list of files", onConsoleDirCommand},
{"cd", NULL, "change directory", onConsoleChangeDirectory}, {"cd", NULL, "change directory", onConsoleChangeDirectory},
{"mkdir", NULL, "make directory", onConsoleMakeDirectory}, {"mkdir", NULL, "make directory", onConsoleMakeDirectory},
@ -3310,4 +3321,4 @@ void initConsole(Console* console, tic_mem* tic, FileSystem* fs, Config* config,
#endif #endif
console->active = !console->embed.yes; console->active = !console->embed.yes;
} }

View File

@ -1002,6 +1002,10 @@ static const tic_outline_item* getJsOutline(const char* code, s32* size)
return items; return items;
} }
void evalJs(tic_mem* tic, const char* code) {
printf("TODO: JS eval not yet implemented\n.");
}
static const tic_script_config JsSyntaxConfig = static const tic_script_config JsSyntaxConfig =
{ {
.init = initJavascript, .init = initJavascript,
@ -1012,6 +1016,7 @@ static const tic_script_config JsSyntaxConfig =
.getOutline = getJsOutline, .getOutline = getJsOutline,
.parse = parseCode, .parse = parseCode,
.eval = evalJs,
.blockCommentStart = "/*", .blockCommentStart = "/*",
.blockCommentEnd = "*/", .blockCommentEnd = "*/",

View File

@ -1402,6 +1402,22 @@ static const tic_outline_item* getLuaOutline(const char* code, s32* size)
return items; return items;
} }
void evalLua(tic_mem* tic, const char* code) {
tic_machine* machine = (tic_machine*)tic;
lua_State* lua = machine->lua;
lua_settop(lua, 0);
if(luaL_loadstring(lua, code) != LUA_OK || lua_pcall(lua, 0, LUA_MULTRET, 0) != LUA_OK)
{
machine->data->error(machine->data->data, lua_tostring(lua, -1));
}
}
void evalPlaceholder(tic_mem* tic, const char* code) {
printf("TODO: not yet implemented\n.");
}
static const tic_script_config LuaSyntaxConfig = static const tic_script_config LuaSyntaxConfig =
{ {
.init = initLua, .init = initLua,
@ -1412,6 +1428,7 @@ static const tic_script_config LuaSyntaxConfig =
.getOutline = getLuaOutline, .getOutline = getLuaOutline,
.parse = parseCode, .parse = parseCode,
.eval = evalLua,
.blockCommentStart = "--[[", .blockCommentStart = "--[[",
.blockCommentEnd = "]]", .blockCommentEnd = "]]",
@ -1580,6 +1597,7 @@ static const tic_script_config MoonSyntaxConfig =
.getOutline = getMoonOutline, .getOutline = getMoonOutline,
.parse = parseCode, .parse = parseCode,
.eval = evalPlaceholder,
.blockCommentStart = NULL, .blockCommentStart = NULL,
.blockCommentEnd = NULL, .blockCommentEnd = NULL,
@ -1720,6 +1738,28 @@ static const tic_outline_item* getFennelOutline(const char* code, s32* size)
return items; return items;
} }
void evalFennel(tic_mem* tic, const char* code) {
tic_machine* machine = (tic_machine*)tic;
lua_State* fennel = machine->lua;
lua_settop(fennel, 0);
if (luaL_loadbuffer(fennel, execute_fennel_src, strlen(execute_fennel_src), "execute_fennel") != LUA_OK)
{
machine->data->error(machine->data->data, "failed to load fennel compiler");
}
lua_pushstring(fennel, code);
lua_call(fennel, 1, 1);
const char* err = lua_tostring(fennel, -1);
if (err)
{
machine->data->error(machine->data->data, err);
}
}
static const tic_script_config FennelSyntaxConfig = static const tic_script_config FennelSyntaxConfig =
{ {
.init = initFennel, .init = initFennel,
@ -1730,6 +1770,7 @@ static const tic_script_config FennelSyntaxConfig =
.getOutline = getFennelOutline, .getOutline = getFennelOutline,
.parse = parseCode, .parse = parseCode,
.eval = evalFennel,
.blockCommentStart = NULL, .blockCommentStart = NULL,
.blockCommentEnd = NULL, .blockCommentEnd = NULL,

View File

@ -106,6 +106,7 @@ struct tic_script_config
const tic_outline_item* (*getOutline)(const char* code, s32* size); const tic_outline_item* (*getOutline)(const char* code, s32* size);
void (*parse)(const tic_script_config* config, const char* start, u8* color, const tic_code_theme* theme); void (*parse)(const tic_script_config* config, const char* start, u8* color, const tic_code_theme* theme);
void (*eval)(tic_mem* tic, const char* code);
const char* blockCommentStart; const char* blockCommentStart;
const char* blockCommentEnd; const char* blockCommentEnd;

View File

@ -1344,6 +1344,10 @@ static const tic_outline_item* getWrenOutline(const char* code, s32* size)
return items; return items;
} }
void evalWren(tic_mem* tic, const char* code) {
printf("TODO: Wren eval not yet implemented\n.");
}
static const tic_script_config WrenSyntaxConfig = static const tic_script_config WrenSyntaxConfig =
{ {
.init = initWren, .init = initWren,
@ -1354,6 +1358,7 @@ static const tic_script_config WrenSyntaxConfig =
.getOutline = getWrenOutline, .getOutline = getWrenOutline,
.parse = parseCode, .parse = parseCode,
.eval = evalWren,
.blockCommentStart = "/*", .blockCommentStart = "/*",
.blockCommentEnd = "*/", .blockCommentEnd = "*/",