Well, I really made a mess with the last commit; this one sorts it out.
This commit is contained in:
parent
1196b3eb1d
commit
a302663b32
16 changed files with 3671 additions and 0 deletions
92
src/c/ops/assoc.c
Normal file
92
src/c/ops/assoc.c
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/**
|
||||
* ops/assoc.c
|
||||
*
|
||||
* Post Scarcity Software Environment: assoc.
|
||||
*
|
||||
* Search a store for the value associated with a key.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* 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 "memory/pso2.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/cons.h"
|
||||
|
||||
#include "ops/eq.h"
|
||||
#include "ops/truth.h"
|
||||
|
||||
/**
|
||||
* @brief: fundamental search function; only knows about association lists
|
||||
*
|
||||
* @param key a pointer indicating the key to search for;
|
||||
* @param store a pointer indicating the store to search;
|
||||
* @param return_key if a binding is found for `key` in `store`, if true
|
||||
* return the key found in the store, else return the value
|
||||
*
|
||||
* @return nil if no binding for `key` is found in `store`; otherwise, if
|
||||
* `return_key` is true, return the key from the store; else
|
||||
* return the binding.
|
||||
*/
|
||||
struct pso_pointer search( struct pso_pointer key,
|
||||
struct pso_pointer store,
|
||||
bool return_key ) {
|
||||
struct pso_pointer result = nil;
|
||||
bool found = false;
|
||||
|
||||
if (consp( store)) {
|
||||
for ( struct pso_pointer cursor = store;
|
||||
consp( store) && found == false;
|
||||
cursor = cdr( cursor)) {
|
||||
struct pso_pointer pair = car( cursor);
|
||||
|
||||
if (consp(pair) && equal(car(pair), key)) {
|
||||
found = true;
|
||||
result = return_key ? car(pair) : cdr( pair);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @prief: bootstap layer assoc; only knows about association lists.
|
||||
*
|
||||
* @param key a pointer indicating the key to search for;
|
||||
* @param store a pointer indicating the store to search;
|
||||
*
|
||||
* @return a pointer to the value of the key in the store, or nil if not found
|
||||
*/
|
||||
struct pso_pointer assoc( struct pso_pointer key, struct pso_pointer store) {
|
||||
return search( key, store, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @prief: bootstap layer interned; only knows about association lists.
|
||||
*
|
||||
* @param key a pointer indicating the key to search for;
|
||||
* @param store a pointer indicating the store to search;
|
||||
*
|
||||
* @return a pointer to the copy of the key in the store, or nil if not found.
|
||||
*/
|
||||
struct pso_pointer interned(struct pso_pointer key, struct pso_pointer store) {
|
||||
return search( key, store, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @prief: bootstap layer interned; only knows about association lists.
|
||||
*
|
||||
* @param key a pointer indicating the key to search for;
|
||||
* @param store a pointer indicating the store to search;
|
||||
*
|
||||
* @return `true` if a pointer the key was found in the store..
|
||||
*/
|
||||
bool internedp(struct pso_pointer key, struct pso_pointer store) {
|
||||
return !nilp( search( key, store, true));
|
||||
}
|
||||
28
src/c/ops/assoc.h
Normal file
28
src/c/ops/assoc.h
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
* ops/assoc.h
|
||||
*
|
||||
* Post Scarcity Software Environment: assoc.
|
||||
*
|
||||
* Search a store for the value associated with a key.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef __psse_ops_assoc_h
|
||||
#define __psse_ops_assoc_h
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "memory/pointer.h"
|
||||
|
||||
struct cons_pointer search( struct pso_pointer key,
|
||||
struct pso_pointer store,
|
||||
bool return_key );
|
||||
|
||||
struct pso_pointer assoc( struct pso_pointer key, struct pso_pointer store);
|
||||
|
||||
struct pso_pointer interned(struct pso_pointer key, struct pso_pointer store);
|
||||
|
||||
bool internedp(struct pso_pointer key, struct pso_pointer store);
|
||||
#endif
|
||||
55
src/c/ops/reverse.c
Normal file
55
src/c/ops/reverse.c
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* ops/reverse.c
|
||||
*
|
||||
* Post Scarcity Software Environment: reverse.
|
||||
*
|
||||
* Reverse a sequence. Didn'e want to do this in the substrate, but I need
|
||||
* if for reading atoms!.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* 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 "memory/pso.h"
|
||||
#include "memory/pso2.h"
|
||||
#include "memory/tags.h"
|
||||
|
||||
#include "payloads/cons.h"
|
||||
#include "payloads/exception.h"
|
||||
#include "payloads/psse_string.h"
|
||||
|
||||
#include "ops/string_ops.h"
|
||||
#include "ops/truth.h"
|
||||
|
||||
struct pso_pointer reverse( struct pso_pointer sequence) {
|
||||
struct pso_pointer result = nil;
|
||||
|
||||
for (struct pso_pointer cursor = sequence; !nilp( sequence); cursor = cdr(cursor)) {
|
||||
struct pso2* object = pointer_to_object( cursor);
|
||||
switch (get_tag_value(cursor)) {
|
||||
case CONSTV :
|
||||
result = cons( car(cursor), result);
|
||||
break;
|
||||
case KEYTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, KEYTAG);
|
||||
break;
|
||||
case STRINGTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, STRINGTAG);
|
||||
break;
|
||||
case SYMBOLTV :
|
||||
result = make_string_like_thing( object->payload.string.character, result, SYMBOLTAG);
|
||||
break;
|
||||
default :
|
||||
result = make_exception( c_string_to_lisp_string(L"Invalid object in sequence"), nil, nil);
|
||||
goto exit;
|
||||
break;
|
||||
}
|
||||
}
|
||||
exit:
|
||||
|
||||
return result;
|
||||
}
|
||||
21
src/c/ops/reverse.h
Normal file
21
src/c/ops/reverse.h
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/**
|
||||
* ops/reverse.h
|
||||
*
|
||||
* Post Scarcity Software Environment: reverse.
|
||||
*
|
||||
* Reverse a sequence.
|
||||
*
|
||||
* (c) 2026 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#ifndef __psse_ops_reverse_h
|
||||
#define __psse_ops_reverse_h
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "memory/pointer.h"
|
||||
|
||||
struct pso_pointer reverse( struct pso_pointer sequence);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue