Started work on binding functions. Not yet complete.
This commit is contained in:
parent
f4303247b9
commit
efa6a3246d
17 changed files with 321 additions and 41 deletions
|
|
@ -115,13 +115,8 @@ bool c_internedp( struct pso_pointer key, struct pso_pointer store ) {
|
|||
* @return a pointer to the value of the key in the store, or nil if not found
|
||||
*/
|
||||
struct pso_pointer assoc(
|
||||
#ifndef MANAGED_POINTER_ONLY
|
||||
struct pso4 *frame,
|
||||
#endif
|
||||
struct pso_pointer frame_pointer ) {
|
||||
#ifdef MANAGED_POINTER_ONLY
|
||||
struct pso4 *frame = pointer_to_pso4( frame_pointer );
|
||||
#endif
|
||||
struct pso_pointer key = fetch_arg( frame, 0 );
|
||||
struct pso_pointer store = or( make_frame( 2, frame_pointer,
|
||||
fetch_arg( frame, 1 ),
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include "memory/pointer.h"
|
||||
|
||||
struct pso_pointer assoc(struct pso_pointer frame_pointer);
|
||||
|
||||
struct pso_pointer search( struct pso_pointer key,
|
||||
struct pso_pointer store, bool return_key );
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "ops/eval_apply.h"
|
||||
|
|
@ -29,12 +30,12 @@
|
|||
*/
|
||||
struct pso_pointer eval_cond_clause( struct pso_pointer clause,
|
||||
struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer frame_pointer) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso_pointer env = fetch_env(frame_pointer);
|
||||
|
||||
#ifdef DEBUG
|
||||
debug_print( L"\n\tCond clause: ", DEBUG_EVAL, 0 );
|
||||
debug_print( U"\n\tCond clause: ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( clause, DEBUG_EVAL, 0 );
|
||||
debug_println( DEBUG_EVAL);
|
||||
#endif
|
||||
|
|
@ -49,19 +50,19 @@ struct pso_pointer eval_cond_clause( struct pso_pointer clause,
|
|||
c_progn( frame, frame_pointer, c_cdr( clause ), env ) );
|
||||
|
||||
#ifdef DEBUG
|
||||
debug_print( L"\n\t\tCond clause ", DEBUG_EVAL, 0 );
|
||||
debug_print( U"\n\t\tCond clause ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( clause, DEBUG_EVAL, 0 );
|
||||
debug_print( L" succeeded; returning: ", DEBUG_EVAL, 0 );
|
||||
debug_print( U" succeeded; returning: ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( result, DEBUG_EVAL, 0 );
|
||||
debug_println( DEBUG_EVAL);
|
||||
} else {
|
||||
debug_print( L"\n\t\tCond clause ", DEBUG_EVAL, 0 );
|
||||
debug_print( U"\n\t\tCond clause ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( clause, DEBUG_EVAL, 0 );
|
||||
debug_print( L" failed.\n", DEBUG_EVAL, 0 );
|
||||
debug_print( U" failed.\n", DEBUG_EVAL, 0 );
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
result = throw_exception( c_string_to_lisp_symbol( frame_pointer, L"cond" ),
|
||||
result = throw_exception( c_string_to_lisp_symbol( frame_pointer, U"cond" ),
|
||||
c_string_to_lisp_string
|
||||
(frame_pointer, L"Arguments to `cond` must be lists" ),
|
||||
frame_pointer );
|
||||
|
|
@ -78,14 +79,10 @@ struct pso_pointer eval_cond_clause( struct pso_pointer clause,
|
|||
*
|
||||
* * (cond clauses...)
|
||||
*
|
||||
* @param frame my stack frame.
|
||||
* @param frame_pointer a pointer to my pso4.
|
||||
* @param env the environment in which arguments will be evaluated.
|
||||
* @return the value of the last expression of the first successful `clause`.
|
||||
*/
|
||||
struct pso_pointer
|
||||
lisp_cond( struct pso4 *frame, struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
struct pso_pointer lisp_cond(struct pso_pointer frame_pointer) {
|
||||
struct pso4 *frame = pointer_to_pso4(frame_pointer);
|
||||
struct pso_pointer result = nil;
|
||||
bool done = false;
|
||||
|
||||
|
|
@ -97,7 +94,7 @@ lisp_cond( struct pso4 *frame, struct pso_pointer frame_pointer,
|
|||
// to nil, the form still succeeded and we should still exit `cond`.
|
||||
//
|
||||
|
||||
result = eval_cond_clause( clause_pointer, frame, frame_pointer, env );
|
||||
result = eval_cond_clause( clause_pointer, frame, frame_pointer );
|
||||
|
||||
if ( !c_nilp( result ) && c_truep( c_car( result ) ) ) {
|
||||
result = c_cdr( result );
|
||||
|
|
@ -106,7 +103,7 @@ lisp_cond( struct pso4 *frame, struct pso_pointer frame_pointer,
|
|||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
debug_print( L"\tCond returning: ", DEBUG_EVAL, 0 );
|
||||
debug_print( U"\tCond returning: ", DEBUG_EVAL, 0 );
|
||||
debug_print_object( result, DEBUG_EVAL, 0 );
|
||||
debug_println( DEBUG_EVAL);
|
||||
#endif
|
||||
|
|
|
|||
20
src/c/ops/cond.h
Normal file
20
src/c/ops/cond.h
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
/**
|
||||
* ops/cond.h
|
||||
*
|
||||
* Post Scarcity Software Environment: cond.
|
||||
*
|
||||
* cond a name to a value in a store.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef __psse_ops_cond_h
|
||||
#define __psse_ops_cond_h
|
||||
|
||||
#include "memory/pointer.h"
|
||||
|
||||
|
||||
struct pso_pointer lisp_cond( struct pso_pointer frame_pointer );
|
||||
|
||||
#endif
|
||||
|
|
@ -131,7 +131,7 @@ struct pso_pointer eq(
|
|||
* * symbols
|
||||
* * strings
|
||||
*
|
||||
* * (equal? arg1 qrg2)
|
||||
* * (equal? arg1 arg2)
|
||||
*
|
||||
* @return `t` if all args are pointers to the same object, else `nil`;
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -260,8 +260,7 @@ struct pso_pointer eval_forms( struct pso_pointer frame_pointer ) {
|
|||
*
|
||||
* This is experimental. It almost certainly WILL change.
|
||||
*/
|
||||
struct pso_pointer lisp_try( struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
struct pso_pointer lisp_try( struct pso_pointer frame_pointer) {
|
||||
struct pso_pointer result = nil;
|
||||
struct pso4 *frame = pointer_to_pso4( frame_pointer );
|
||||
struct pso_pointer body_frame =
|
||||
|
|
@ -301,8 +300,7 @@ struct pso_pointer lisp_try( struct pso_pointer frame_pointer,
|
|||
* @return the root namespace.
|
||||
*/
|
||||
struct pso_pointer
|
||||
lisp_oblist( struct pso4 *frame, struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
lisp_oblist( struct pso4 *frame, struct pso_pointer frame_pointer) {
|
||||
return oblist;
|
||||
}
|
||||
|
||||
|
|
@ -750,9 +748,6 @@ struct pso_pointer lisp_apply( struct pso_pointer frame_pointer) {
|
|||
*
|
||||
* * (eval expression)
|
||||
*
|
||||
* @param frame my pso4.
|
||||
* @param frame_pointer a pointer to my pso4.
|
||||
* @param env my environment.
|
||||
* @return
|
||||
* * If `expression` is a number, string, `nil`, or `t`, returns `expression`.
|
||||
* * If `expression` is a symbol, returns the value that expression is bound
|
||||
|
|
|
|||
|
|
@ -21,10 +21,7 @@
|
|||
#include "ops/stack_ops.h"
|
||||
|
||||
/**
|
||||
* Function: dump/inspect one complete lisp expression and return nil. If
|
||||
* write-stream is specified and is a write stream, then print to that stream,
|
||||
* else the stream which is the value of
|
||||
* `*out*` in the environment.
|
||||
* Function: dump/
|
||||
*
|
||||
* * (inspect expr)
|
||||
* * (inspect expr write-stream)
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@
|
|||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef psse_ops_inspect
|
||||
#define psse_ops_inspect
|
||||
#ifndef psse_ops_inspect_h
|
||||
#define psse_ops_inspect_h
|
||||
|
||||
#include "memory/pointer.h"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue