Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* file "sophie.salm" */
- /*
- * This file contains a Salmon interactive interpreter (a REPL).
- * Run with: `salmoneye sophie.salm`
- * Or with the optimized interpreter: `salmoneye.fast sophie.salm`
- * Written by Tommy Ettinger, named after his dog.
- */
- /*
- This is free and unencumbered software released into the public domain.
- Anyone is free to copy, modify, publish, use, compile, sell, or
- distribute this software, either in source code form or as a compiled
- binary, for any purpose, commercial or non-commercial, and by any
- means.
- In jurisdictions that recognize copyright laws, the author or authors
- of this software dedicate any and all copyright interest in the
- software to the public domain. We make this dedication for the benefit
- of the public at large and to the detriment of our heirs and
- successors. We intend this dedication to be an overt act of
- relinquishment in perpetuity of all present and future rights to this
- software under copyright law.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- For more information, please refer to <http://unlicense.org/>
- */
- use "parse.salm" : "parse.si";
- print("Welcome to Sophie, an interactive mode for Salmon.\nPress Ctrl-C to quit.\n");
- variable ln := "";
- variable src := "";
- variable mute := "variable __dum := (variable := \"\" ); variable __out := standard_output; \n standard_output := open_output_string(__dum);\n";
- variable unmute := " standard_output := __out; \n";
- while(ln != end_of_input)
- {
- print("> ");
- ln ~= read_line();
- try
- {
- variable sb := parse_statement_block(mute ~ src ~ unmute ~ ln);
- sb.bind_standard_library();
- sb.run();
- src ~= ln;
- }
- catch
- {
- if (current_exceptions()[0].tag == et_parse_syntax_error)
- {
- try
- {
- variable px := parse_expression(ln);
- px.bind_standard_library();
- px.run()!
- ln := "";
- goto continue;
- }
- catch
- {
- if (current_exceptions()[0].tag == et_parse_more)
- {
- try
- {
- variable psb := parse_statement_block("variable o_o := " ~ ln ~ "\no_o!");
- psb.bind_standard_library();
- psb.run();
- ln := "";
- goto continue;
- }
- catch
- {
- //current_exceptions()[0].message!
- };
- };
- print(">");
- goto continue;
- };
- };
- current_exceptions()[0].message!
- };
- ln := "";
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement