ref: 1c840d5c5ab6326492542886297d5bafa2877c4d
parent: 6c539b4da8be5dd00a6685d744544275774128d0
author: Peter Mikkelsen <peter@pmikkelsen.com>
date: Mon Jul 19 10:40:19 EDT 2021
Update TODO
--- a/TODO
+++ b/TODO
@@ -1,10 +1,5 @@
* Stop comparing strings all the time
* Stop copying the entire goal stack into every choicepoint
-* Stop creating choicepoints when it is not needed
-* How to implement builtins nicely?
-* Right now we copy and allocate a lot, but almost never free stuff.
-* Many builtins should really throw an error, but they just fail for now.
-* Exceptions (throw, catch)
* Modules (I try to do something like SWI prolog for now, but I know there is also an iso standard)
The following builtins:
@@ -12,4 +7,24 @@
unify_with_occurs_check/2: not implemented
'\\='/2: handle occurs check
-* Handle overflow and uderflow in arithmetic
\ No newline at end of file
+* Handle overflow and uderflow in arithmetic
+
+* Variables should be compared and printed in a way that makes sense. Right now, their number is changed when a clause is used,
+ but their name remains the same, so prints will be bad.
+
+* Write a loader in prolog, that calls builtins to activate the C functions needed. This means we can do some syntax transformations
+ and handle directives in prolog code, instead of C. The "bootstrap" modules will have to be written in a way the original C loader
+ understands, but everything after that can use the full feature set.
+ Steps:
+ 1) Change the lexer and parser so they carry around their state instead of global variables.
+ 2) Make it possible to evaluate a query using 'evalquery' even when another query is running. This
+ means no more global variables there either.
+ 3) Create a "loading context" which is indexed by a prolog term and consists of:
+ * Lexer + parser state
+ * module loading state
+ 4) Loading then becomes:
+ 1) Create loading context
+ 2) Open file
+ 3) Repeatedly read terms using read_term
+ 4) Inspect the term (clause or directive?) and act on it, using builtints and reference to context
+ 5) Close the file and context