My monster, it not only compiles, it now runs!
This commit is contained in:
parent
60921be3d4
commit
a8b4a6e69d
26 changed files with 244 additions and 172 deletions
|
|
@ -13,6 +13,7 @@
|
|||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "payloads/stack.h"
|
||||
#include "ops/stack_ops.h"
|
||||
#include "ops/truth.h"
|
||||
|
||||
/**
|
||||
|
|
@ -48,9 +49,12 @@ struct pso_pointer lisp_eq( struct pso4 *frame,
|
|||
struct pso_pointer env ) {
|
||||
struct pso_pointer result = t;
|
||||
|
||||
if ( frame->args > 1 ) {
|
||||
for ( int b = 1; ( truep( result ) ) && ( b < frame->args ); b++ ) {
|
||||
result = eq( fetch_arg(frame, 0), fetch_arg( frame, b ) ) ? t : nil;
|
||||
if ( frame->payload.stack_frame.args > 1 ) {
|
||||
for ( int b = 1;
|
||||
( truep( result ) ) && ( b < frame->payload.stack_frame.args );
|
||||
b++ ) {
|
||||
result =
|
||||
eq( fetch_arg( frame, 0 ), fetch_arg( frame, b ) ) ? t : nil;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
/**
|
||||
* ops/repl.h
|
||||
*
|
||||
* The read/eval/print loop.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef __psse_ops_repl_h
|
||||
#define __psse_ops_repl_h
|
||||
|
||||
// struct pso_pointer repl( struct pso_pointer prompt, struct pso_pointer readtable);
|
||||
|
||||
#endif
|
||||
42
src/c/ops/stack_ops.c
Normal file
42
src/c/ops/stack_ops.c
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
/**
|
||||
* payloads/stack.c
|
||||
*
|
||||
* The execution stack.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#include "memory/node.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/pso4.h"
|
||||
#include "payloads/stack.h"
|
||||
|
||||
/**
|
||||
* @brief The maximum depth of stack before we throw an exception.
|
||||
*
|
||||
* `0` is interpeted as `unlimited`.
|
||||
*/
|
||||
uint32_t stack_limit = 0;
|
||||
|
||||
/**
|
||||
* Fetch a pointer to the value of the local variable at this index.
|
||||
*/
|
||||
struct pso_pointer fetch_arg( struct pso4 *frame, unsigned int index ) {
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
// TODO check that the frame is indeed a frame!
|
||||
if ( index < args_in_frame ) {
|
||||
result = frame->payload.stack_frame.arg[index];
|
||||
} else {
|
||||
struct pso_pointer p = frame->payload.stack_frame.more;
|
||||
|
||||
for ( int i = args_in_frame; i < index; i++ ) {
|
||||
p = pointer_to_object( p )->payload.cons.cdr;
|
||||
}
|
||||
|
||||
result = pointer_to_object( p )->payload.cons.car;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
30
src/c/ops/stack_ops.h
Normal file
30
src/c/ops/stack_ops.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* ops/stack_ops.h
|
||||
*
|
||||
* Operations on a Lisp stack frame.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef __psse_ops_stack_ops_h
|
||||
#define __psse_ops_stack_ops_h
|
||||
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso4.h"
|
||||
|
||||
/*
|
||||
* number of arguments stored in a stack frame
|
||||
*/
|
||||
#define args_in_frame 8
|
||||
|
||||
/**
|
||||
* @brief The maximum depth of stack before we throw an exception.
|
||||
*
|
||||
* `0` is interpeted as `unlimited`.
|
||||
*/
|
||||
extern uint32_t stack_limit;
|
||||
|
||||
struct pso_pointer fetch_arg( struct pso4 *frame, unsigned int index );
|
||||
|
||||
#endif
|
||||
|
|
@ -9,6 +9,12 @@
|
|||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "memory/node.h"
|
||||
#include "memory/pointer.h"
|
||||
#include "ops/stack_ops.h"
|
||||
|
||||
/**
|
||||
* @brief true if `p` points to `nil`, else false.
|
||||
*
|
||||
|
|
@ -20,8 +26,8 @@
|
|||
* @return true if `p` points to `nil`.
|
||||
* @return false otherwise.
|
||||
*/
|
||||
bool nilp( struct pso_pointer p) {
|
||||
return (p.page == 0 && p.offset = 0);
|
||||
bool nilp( struct pso_pointer p ) {
|
||||
return ( p.page == 0 && p.offset == 0 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -31,8 +37,8 @@ bool nilp( struct pso_pointer p) {
|
|||
* @return true if `p` points to `nil`;
|
||||
* @return false otherwise.
|
||||
*/
|
||||
bool not( struct pso_pointer p) {
|
||||
return !nilp( p);
|
||||
bool not( struct pso_pointer p ) {
|
||||
return !nilp( p );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -46,8 +52,8 @@ bool not( struct pso_pointer p) {
|
|||
* @return true if `p` points to `t`.
|
||||
* @return false otherwise.
|
||||
*/
|
||||
bool truep( struct pso_pointer p) {
|
||||
return (p.page == 0 && p.offset = 1);
|
||||
bool truep( struct pso_pointer p ) {
|
||||
return ( p.page == 0 && p.offset == 1 );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -58,10 +64,10 @@ bool truep( struct pso_pointer p) {
|
|||
* @param env the evaluation environment.
|
||||
* @return `t` if the first argument in this frame is `nil`, else `t`
|
||||
*/
|
||||
pso_pointer lisp_nilp( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ){
|
||||
return (nilp(frame->payload.stack_frame.arg[0]) ? t : nil);
|
||||
struct pso_pointer lisp_nilp( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
return ( nilp( fetch_arg( frame, 0 )) ? t : nil );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -72,10 +78,10 @@ pso_pointer lisp_nilp( struct pso4 *frame,
|
|||
* @param env the evaluation environment.
|
||||
* @return `t` if the first argument in this frame is `t`, else `nil`.
|
||||
*/
|
||||
pso_pointer lisp_truep( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ){
|
||||
return (truep(frame->payload.stack_frame.arg[0]) ? t : nil);
|
||||
struct pso_pointer lisp_truep( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
return ( truep( fetch_arg( frame, 0 ) ) ? t : nil );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -87,8 +93,8 @@ pso_pointer lisp_truep( struct pso4 *frame,
|
|||
* @param env the evaluation environment.
|
||||
* @return `t` if the first argument in this frame is not `nil`, else `t`.
|
||||
*/
|
||||
pso_pointer lisp_not( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ){
|
||||
return (not(frame->payload.stack_frame.arg[0]) ? t : nil);
|
||||
struct pso_pointer lisp_not( struct pso4 *frame,
|
||||
struct pso_pointer frame_pointer,
|
||||
struct pso_pointer env ) {
|
||||
return ( not( fetch_arg( frame, 0 ) ) ? t : nil );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,10 @@
|
|||
|
||||
#ifndef __psse_ops_truth_h
|
||||
#define __psse_ops_truth_h
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "memory/pointer.h"
|
||||
#include "memory/pso4.h"
|
||||
|
||||
bool nilp( struct pso_pointer p );
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue