int main() { int i = 1337; prebind(f, 42, std::ref(i))(0); std::cout << i << "\n"; auto b = prebind(g, 1); std::cout << b(3, 8, 13); }
void VM::standalone() { loop: try { reset(); scm_closure_t closure = lookup_system_closure(".@start-scheme-session"); m_pc = closure->code; prebind(m_pc); run(false); } catch (vm_exit_t& e) { #if PROFILE_OPCODE display_opcode_profile(); #endif #if PROFILE_SUBR display_subr_profile(); #endif exit(e.m_code); } catch (vm_exception_t& e) { backtrace(m_current_error); goto loop; } catch (io_exception_t& e) { if (e.m_err == EINTR) goto loop; if (e.m_err == EIO) goto loop; fatal("fatal in run: unexpected io_expecption_t(%d, %s)", e.m_err, e.m_message); } catch (reader_exception_t& e) { fatal("fatal in run: unhandled exception reader_expecption_t(%s)", e.m_message); } catch (io_codec_exception_t& e) { fatal("fatal in run: unhandled exception io_codec_exception_t(%d, %s)", e.m_operation, e.m_message); } catch (vm_escape_t& e) { fatal("fatal in run: unhandled exception vm_escape_t, maybe (escape) procedure in bad context"); } catch (vm_continue_t& e) { fatal("fatal in run: unhandled exception vm_continue_t, maybe (escape) procedure in bad context"); } catch (int code) { fatal("fatal in run: unexpected exception (errno %d, %s)", code, strerror(code)); } catch (...) { fatal("fatal in run: unknown exception"); } }
void VM::boot() { try { #if USE_DEBUG_BOOT { char load_path[] = "heap/debug-boot.vmi"; m_bootport = make_file_port(m_heap, make_string_literal(m_heap, load_path), SCM_PORT_DIRECTION_IN, 0, SCM_PORT_BUFFER_MODE_BLOCK, scm_true); printf(";; loading \"%s\"\n", load_path); fflush(stdout); scoped_lock lock_port(m_bootport->lock); while (true) { reset(); scm_obj_t obj = reader_t(this, m_bootport).read(NULL); if (obj == scm_eof) break; m_pc = obj; prebind(m_pc); run(false); } port_close(m_bootport); } #else { scm_bvector_t bv = make_bvector_mapping(m_heap, (void*)s_bootimage, sizeof(s_bootimage)); m_bootport = make_bytevector_port(m_heap, make_symbol(m_heap, "bootimage"), SCM_PORT_DIRECTION_IN, bv, scm_true); scoped_lock lock_port(m_bootport->lock); while (true) { reset(); scm_obj_t obj = reader_t(this, m_bootport).read(NULL); if (obj == scm_eof) break; m_pc = obj; prebind(m_pc); run(false); } port_close(m_bootport); } #endif m_bootport = (scm_port_t)scm_unspecified; m_current_environment = m_heap->m_interaction_environment; #if USE_DEBUG_CORE { char load_path[] = "heap/debug-core.vmi"; m_bootport = make_file_port(m_heap, make_string_literal(m_heap, load_path), SCM_PORT_DIRECTION_IN, 0, SCM_PORT_BUFFER_MODE_BLOCK, scm_true); printf(";; loading \"%s\"\n", load_path); fflush(stdout); scoped_lock lock_port(m_bootport->lock); while (true) { reset(); scm_obj_t obj = reader_t(this, m_bootport).read(NULL); if (obj == scm_eof) break; m_pc = obj; prebind(m_pc); run(false); } port_close(m_bootport); } #elif USE_INTERNED_CORE { scm_bvector_t bv = make_bvector_mapping(m_heap, (void*)s_coreimage, sizeof(s_coreimage)); m_bootport = make_bytevector_port(m_heap, make_symbol(m_heap, "bootimage"), SCM_PORT_DIRECTION_IN, bv, scm_true); scoped_lock lock_port(m_bootport->lock); while (true) { reset(); scm_obj_t obj = reader_t(this, m_bootport).read(NULL); if (obj == scm_eof) break; m_pc = obj; prebind(m_pc); run(false); } port_close(m_bootport); } #endif m_bootport = (scm_port_t)scm_unspecified; } catch (vm_exception_t& e) { fatal("fatal in boot: unexpected vm_exception_t"); } catch (reader_exception_t& e) { fatal("fatal in boot: unexpected reader_expecption_t(%s)", e.m_message); } catch (io_exception_t& e) { fatal("fatal in boot: unexpected io_expecption_t(%d, %s)", e.m_err, e.m_message); } catch (io_codec_exception_t& e) { fatal("fatal in boot: unexpected io_codec_exception_t(%d, %s)", e.m_operation, e.m_message); } catch (vm_escape_t& e) { fatal("fatal in boot: unexpected vm_escape_t, maybe <#subr escape> in bad context"); } catch (vm_continue_t& e) { fatal("fatal in boot: unexpected vm_continue_t, maybe <#subr escape> in bad context"); } catch (int code) { fatal("fatal in boot: unexpected system error (errno %d, %s)", code, strerror(code)); } catch (...) { fatal("fatal in boot: unknown exception"); } #if PROFILE_OPCODE memset(m_opcode_profile, 0, sizeof(m_opcode_profile)); #endif }
int main(){ int i = 1337; prebind(f, 42, std::ref(i))(0); std::cout << i << "\n"; }