/** * environment/environment.c * * Initialise a MINIMAL environment. * * (c) 2026 Simon Brooke * Licensed under GPL version 2.0, or, at your option, any later version. */ #include #include "debug.h" #include "memory/memory.h" #include "memory/node.h" #include "memory/pointer.h" #include "memory/pso.h" #include "memory/pso2.h" #include "memory/tags.h" #include "ops/bind.h" #include "ops/string_ops.h" #include "payloads/cons.h" #include "payloads/exception.h" #include "payloads/psse_string.h" /** * @brief Flag to prevent re-initialisation. */ bool environment_initialised = false; /** * @brief Initialise a minimal environment, so that Lisp can be bootstrapped. * * @param node theindex of the node we are initialising. * @return struct pso_pointer t on success, else an exception. */ struct pso_pointer initialise_environment( uint32_t node ) { struct pso_pointer result = initialise_memory( node ); if ( !exceptionp( result ) ) { debug_print( L"Initialising `nil`... ", DEBUG_BOOTSTRAP, 0); struct pso_pointer n = allocate( NILTAG, 2 ); if ( ( n.page == 0 ) && ( n.offset == 0 ) ) { struct pso2 *object = pointer_to_object( n ); object->payload.cons.car = nil; object->payload.cons.cdr = nil; nil = n; debug_print( L"success\n", DEBUG_BOOTSTRAP, 0); } else { result = make_exception( c_string_to_lisp_string ( L"Unexpected cell while allocating `nil`." ), nil, n ); debug_print( L"fail\n", DEBUG_BOOTSTRAP, 0); } } if ( !exceptionp( result ) ) { debug_print( L"Initialising `t`... ", DEBUG_BOOTSTRAP, 0); struct pso_pointer n = allocate( TRUETAG, 2 ); if ( ( n.page == 0 ) && ( n.offset == 1 ) ) { struct pso2 *object = pointer_to_object( n ); object->payload.string.character = L't'; object->payload.cons.cdr = t; t = n; debug_print( L"success\n", DEBUG_BOOTSTRAP, 0); } else { result = make_exception( c_string_to_lisp_string ( L"Unexpected cell while allocating `t`." ), nil, n ); debug_print( L"fail\n", DEBUG_BOOTSTRAP, 0); } } if ( !exceptionp( result ) ) { result = c_bind( c_string_to_lisp_symbol( L"nil" ), nil, nil ); result = c_bind( c_string_to_lisp_symbol( L"t" ), t, result ); environment_initialised = true; } return result; }