Merge branch 'develop' of github.com:simon-brooke/post-scarcity into develop
This commit is contained in:
commit
fd9c851185
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -16,3 +16,5 @@ src/\.#*
|
|||
\.idea/
|
||||
|
||||
post-scarcity\.iml
|
||||
|
||||
doc/
|
||||
|
|
12
Makefile
12
Makefile
|
@ -3,9 +3,12 @@ TARGET ?= target/psse
|
|||
SRC_DIRS ?= ./src
|
||||
|
||||
SRCS := $(shell find $(SRC_DIRS) -name *.cpp -or -name *.c -or -name *.s)
|
||||
HDRS := $(shell find $(SRC_DIRS) -name *.h)
|
||||
OBJS := $(addsuffix .o,$(basename $(SRCS)))
|
||||
DEPS := $(OBJS:.o=.d)
|
||||
|
||||
TESTS := $(shell find unit-tests -name *.sh)
|
||||
|
||||
INC_DIRS := $(shell find $(SRC_DIRS) -type d)
|
||||
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
|
||||
INDENT_FLAGS := -kr -br -brf -brs -ce -cdw -npsl -nut -prs -l79 -ts2
|
||||
|
@ -18,10 +21,13 @@ LDFLAGS := -lm
|
|||
$(TARGET): $(OBJS) Makefile
|
||||
$(CC) $(LDFLAGS) $(OBJS) -DVERSION=$(VERSION) -o $@ $(LDFLAGS) $(LOADLIBES) $(LDLIBS)
|
||||
|
||||
format:
|
||||
indent $(INDENT_FLAGS) $(SRCS) src/*.h
|
||||
doc: $(SRCS) Makefile
|
||||
doxygen
|
||||
|
||||
test:
|
||||
format: $(SRCS) $(HDRS) Makefile
|
||||
indent $(INDENT_FLAGS) $(SRCS) $(HDRS)
|
||||
|
||||
test: $(OBJS) $(TESTS) Makefile
|
||||
bash ./unit-tests.sh
|
||||
|
||||
.PHONY: clean
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* conspage.c
|
||||
*
|
||||
* Setup and tear down cons pages, and (FOR NOW) do primitive
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* consspaceobject.c
|
||||
*
|
||||
* Structures common to all cons space objects.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* equal.c
|
||||
*
|
||||
* Checks for shallow and deep equality
|
||||
|
@ -38,7 +38,7 @@ bool same_type( struct cons_pointer a, struct cons_pointer b ) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Some string will be null terminated and some will be NIL terminated... ooops!
|
||||
* Some strings will be null terminated and some will be NIL terminated... ooops!
|
||||
* @param string the string to test
|
||||
* @return true if it's the end of a string.
|
||||
*/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* init.c
|
||||
*
|
||||
* Start up and initialise the environement - just enough to get working
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* integer.c
|
||||
*
|
||||
* functions for integer cells.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* intern.c
|
||||
*
|
||||
* For now this implements an oblist and shallow binding; local environments can
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* lispops.c
|
||||
*
|
||||
* List processing operations.
|
||||
|
@ -81,7 +81,9 @@ struct cons_pointer c_cdr( struct cons_pointer arg ) {
|
|||
* @param env the evaluation environment.
|
||||
* @return the result of evaluating the form.
|
||||
*/
|
||||
struct cons_pointer eval_form( struct stack_frame *parent, struct cons_pointer form, struct cons_pointer env) {
|
||||
struct cons_pointer eval_form( struct stack_frame *parent,
|
||||
struct cons_pointer form,
|
||||
struct cons_pointer env ) {
|
||||
fputws( L"eval_form: ", stderr );
|
||||
print( stderr, form );
|
||||
fputws( L"\n", stderr );
|
||||
|
@ -161,8 +163,7 @@ c_apply( struct stack_frame *frame, struct cons_pointer env ) {
|
|||
* @param pointer a pointer to the object whose type is requested.
|
||||
* @return As a Lisp string, the tag of the object which is at that pointer.
|
||||
*/
|
||||
struct cons_pointer
|
||||
c_type( struct cons_pointer pointer) {
|
||||
struct cons_pointer c_type( struct cons_pointer pointer ) {
|
||||
char *buffer = malloc( TAGLENGTH + 1 );
|
||||
memset( buffer, 0, TAGLENGTH + 1 );
|
||||
struct cons_space_object cell = pointer2cell( pointer );
|
||||
|
@ -199,6 +200,17 @@ lisp_eval( struct stack_frame *frame, struct cons_pointer env ) {
|
|||
switch ( cell.tag.value ) {
|
||||
case CONSTV:
|
||||
result = c_apply( frame, env );
|
||||
/* I have a profound misunderstanding of how quote and eval should interact!
|
||||
* if ( equal( c_car(frame->arg[0]), c_string_to_lisp_symbol("quote")))
|
||||
* /\* car is QUOTE. TODO: It is ABSURDLY expensive to 'equal' each time! *\/
|
||||
* {
|
||||
* /\* we need to eval it again *\/
|
||||
* frame->arg[0] = result;
|
||||
* fputws( L"quote - re-evaling", stderr);
|
||||
* dump_frame( stderr, frame );
|
||||
* result = c_apply(frame, env);
|
||||
* } */
|
||||
|
||||
break;
|
||||
|
||||
case SYMBOLTV:
|
||||
|
@ -478,9 +490,8 @@ lisp_cond( struct stack_frame *frame, struct cons_pointer env ) {
|
|||
} else if ( nilp( clause_pointer ) ) {
|
||||
done = true;
|
||||
} else {
|
||||
lisp_throw(
|
||||
c_string_to_lisp_string( "Arguments to `cond` must be lists"),
|
||||
frame);
|
||||
lisp_throw( c_string_to_lisp_string
|
||||
( "Arguments to `cond` must be lists" ), frame );
|
||||
}
|
||||
}
|
||||
/* TODO: if there are more than 8 clauses we need to continue into the
|
||||
|
|
|
@ -28,8 +28,7 @@
|
|||
* @param pointer a pointer to the object whose type is requested.
|
||||
* @return As a Lisp string, the tag of the object which is at that pointer.
|
||||
*/
|
||||
struct cons_pointer
|
||||
c_type( struct cons_pointer pointer);
|
||||
struct cons_pointer c_type( struct cons_pointer pointer );
|
||||
|
||||
/*
|
||||
* special forms
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* peano.c
|
||||
*
|
||||
* Basic peano arithmetic
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
/**
|
||||
/*
|
||||
* print.c
|
||||
*
|
||||
* First pass at a printer, for bootstrapping.
|
||||
*
|
||||
*
|
||||
* (c) 2017 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* read.c
|
||||
*
|
||||
* First pass at a reader, for bootstrapping.
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
* real.c
|
||||
*
|
||||
* functions for real number cells.
|
||||
*
|
||||
* (c) 2017 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#include "conspage.h"
|
||||
|
|
10
src/repl.c
10
src/repl.c
|
@ -1,8 +1,12 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
* repl.c
|
||||
*
|
||||
* the read/eval/print loop
|
||||
*
|
||||
* (c) 2017 Simon Brooke <simon@journeyman.cc>
|
||||
* Licensed under GPL version 2.0, or, at your option, any later version.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/*
|
||||
* stack.c
|
||||
*
|
||||
* The Lisp evaluation stack.
|
||||
|
@ -153,7 +153,12 @@ void free_stack_frame( struct stack_frame *frame ) {
|
|||
void dump_frame( FILE * output, struct stack_frame *frame ) {
|
||||
fputws( L"Dumping stack frame\n", output );
|
||||
for ( int arg = 0; arg < args_in_frame; arg++ ) {
|
||||
fwprintf( output, L"Arg %d:", arg );
|
||||
struct cons_space_object cell = pointer2cell( frame->arg[arg] );
|
||||
|
||||
fwprintf( output, L"Arg %d:\t%c%c%c%c\t", arg,
|
||||
cell.tag.bytes[0],
|
||||
cell.tag.bytes[1], cell.tag.bytes[2], cell.tag.bytes[3] );
|
||||
|
||||
print( output, frame->arg[arg] );
|
||||
fputws( L"\n", output );
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue