From 32f01c202def2e868b97591e9de7b2fdf0a1497e Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 22 Aug 2020 21:30:14 -0400
Subject: [PATCH 01/45] Added badges to README.md
---
README.md | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d829f0c..51e22f0 100644
--- a/README.md
+++ b/README.md
@@ -3,4 +3,9 @@
Connery is a experimental lisp-like interpreted programming language that is somewhat themed after veteran actor Sean Connery.
Version 0.0.1
-ConneryLang.org
\ No newline at end of file
+ConneryLang.org
+
+![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/willcipriano/connery?style=for-the-badge)
+![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/willcipriano/Connery?style=for-the-badge)
+![Website](https://img.shields.io/website?style=for-the-badge&url=http%3A%2F%2Fconnerylang.org)
+![Travis (.org)](https://img.shields.io/travis/willcipriano/Connery?style=for-the-badge)
\ No newline at end of file
From f139c18695b6549759f305bbdfad1045c3d18384 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 22 Aug 2020 21:39:19 -0400
Subject: [PATCH 02/45] README.md work
---
README.md | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 51e22f0..a54398f 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,17 @@
Connery is a experimental lisp-like interpreted programming language that is somewhat themed after veteran actor Sean Connery.
-Version 0.0.1
ConneryLang.org
+## Building and running Connery
+The best way to get up and running is clone this repo and allow the Dockerfile to pull all the dependencies for you. This method will drop you right into the Connery REPL.
+```
+1. git clone https://github.com/willcipriano/Connery.git
+2. cd Connery
+3. docker build --tag connery .
+4. docker run -it connery
+```
+
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/willcipriano/connery?style=for-the-badge)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/willcipriano/Connery?style=for-the-badge)
![Website](https://img.shields.io/website?style=for-the-badge&url=http%3A%2F%2Fconnerylang.org)
From 3ccbd5541ef46395f675d915f7a368c77c867e28 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 22 Aug 2020 21:40:46 -0400
Subject: [PATCH 03/45] README.md work
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index a54398f..9a21386 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@ The best way to get up and running is clone this repo and allow the Dockerfile t
3. docker build --tag connery .
4. docker run -it connery
```
+## Documentation
+All documentation is located at ConneryLang.org
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/willcipriano/connery?style=for-the-badge)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/willcipriano/Connery?style=for-the-badge)
From c49ef3e62ea1d14537b16e198d7b07c494b1c9e9 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 22 Aug 2020 21:43:14 -0400
Subject: [PATCH 04/45] README.md work
---
README.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/README.md b/README.md
index 9a21386..46e0b89 100644
--- a/README.md
+++ b/README.md
@@ -15,6 +15,9 @@ The best way to get up and running is clone this repo and allow the Dockerfile t
## Documentation
All documentation is located at ConneryLang.org
+## Credits
+Connery is based on the work of [Daniel Holden](http://www.theorangeduck.com/page/about), his fantastic book [Build Your Own Lisp](http://www.buildyourownlisp.com/) and library [mpc](https://github.com/orangeduck/mpc). It is also inspired by [ArnoldC](https://lhartikk.github.io/ArnoldC/) as well as countless other joke programming languages. It was created by [Will Cipriano](https://thoughts.willcipriano.com/contact/).
+
![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/willcipriano/connery?style=for-the-badge)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/willcipriano/Connery?style=for-the-badge)
![Website](https://img.shields.io/website?style=for-the-badge&url=http%3A%2F%2Fconnerylang.org)
From c8abbbe54c4901c974ae7a0c51f4a4c5be6a462e Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Mon, 24 Aug 2020 20:37:46 -0400
Subject: [PATCH 05/45] Simplify functional.connery
---
src/stdlib/functional.connery | 22 +---------------------
1 file changed, 1 insertion(+), 21 deletions(-)
diff --git a/src/stdlib/functional.connery b/src/stdlib/functional.connery
index 93de8ab..6bdb6f7 100644
--- a/src/stdlib/functional.connery
+++ b/src/stdlib/functional.connery
@@ -11,28 +11,8 @@
(def {curry} unpack)
(def {uncurry} pack)
-; do
-(fun {do & l} {
- if (== l None)
- {None}
- {last l}
-})
-
-; shcope
- (fun {shcope b} {
- ((\ {_} b) ())
- })
-
; flipargs
(fun {flipargs f a b} {f b a})
; addfunc
-(fun {addfunc f g x} {f (g x)})
-
-(fun {case & cs} {
- if (== cs None)
- {None}
- {if (first (first cs))
- {second (first cs)}
- {unpack case (tail cs)}}
-})
\ No newline at end of file
+(fun {addfunc f g x} {f (g x)})
\ No newline at end of file
From bf7204d7976a901412da8e19a5b66701443cb397 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Mon, 24 Aug 2020 20:43:35 -0400
Subject: [PATCH 06/45] Simplify functional.connery further
---
src/stdlib/functional.connery | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/src/stdlib/functional.connery b/src/stdlib/functional.connery
index 6bdb6f7..2c1623b 100644
--- a/src/stdlib/functional.connery
+++ b/src/stdlib/functional.connery
@@ -3,16 +3,5 @@
def (head f) (\ (tail f) b)
}))
-; Currying
-(fun {unpack f l} {
- eval (join (list f) l)
-})
-(fun {pack f & xs} {f xs})
-(def {curry} unpack)
-(def {uncurry} pack)
-
; flipargs
(fun {flipargs f a b} {f b a})
-
-; addfunc
-(fun {addfunc f g x} {f (g x)})
\ No newline at end of file
From c931ca426b5515d5c7903dbd4c11694d881c58af Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Tue, 25 Aug 2020 19:38:38 -0400
Subject: [PATCH 07/45] Added Boolean values
---
src/cval.c | 32 +++++++++++++++++++++++++
src/cval.h | 8 +++++--
src/main.c | 45 +++++++++++++++++++++++-------------
src/stdlib/constants.connery | 2 --
src/stdlib/types.connery | 14 +++++++++++
5 files changed, 81 insertions(+), 20 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index ebeefa0..9c1ab63 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -38,6 +38,7 @@ char* ctype_name(int t) {
case CVAL_Q_EXPRESSION: return "Q-Expression";
case CVAL_STRING: return "String";
case CVAL_FLOAT: return "Float";
+ case CVAL_BOOLEAN: return "Boolean";
default: return "Unknown Type";
}
}
@@ -107,6 +108,20 @@ cval* cval_q_expression(void) {
return value;
}
+cval* cval_boolean(bool b) {
+ cval* value = malloc(sizeof(cval));
+ value->type = CVAL_BOOLEAN;
+ value->boolean = b;
+ if (b) {
+ value->num = 1;
+ }
+ else {
+ value->num = 0;
+ }
+ value->count = 0;
+ value->cell = NULL;
+ return value;
+}
cenv* cenv_new(void) {
@@ -440,6 +455,13 @@ cval* cval_join(cval* x, cval* y) {
return x;
}
+cval* cval_read_boolean(mpc_ast_t* t) {
+ if(strstr(t->contents, "True")) {
+ return cval_boolean(true);
+ }
+ return cval_boolean(false);
+}
+
cval* cval_read_num(mpc_ast_t* t) {
errno = 0;
long x = strtol(t->contents, NULL, 10);
@@ -466,6 +488,9 @@ cval* cval_read_string(mpc_ast_t* t) {
cval* cval_read(mpc_ast_t* t) {
+ if (strstr(t->tag, "boolean")) {
+ return cval_read_boolean(t);
+ }
if (strstr(t->tag, "number")) {
return cval_read_num(t);
}
@@ -560,6 +585,13 @@ void cval_expr_ht_print(cval* value, char open, char close, char* key) {
void cval_print(cval* value) {
switch (value->type) {
+ case CVAL_BOOLEAN:
+ if (value->boolean) {
+ printf("True");
+ } else {
+ printf("False");}
+ break;
+
case CVAL_NUMBER:
printf("%li", value->num);
break;
diff --git a/src/cval.h b/src/cval.h
index fe2373b..7b315b3 100644
--- a/src/cval.h
+++ b/src/cval.h
@@ -3,6 +3,7 @@
#include "mpc.h"
#include "hashtable.h"
+#include
typedef struct cval cval;
typedef struct cenv cenv;
@@ -11,7 +12,8 @@ typedef cval *(*cbuiltin)(cenv *, cval *);
enum {
CVAL_NUMBER, CVAL_ERROR, CVAL_SYMBOL, CVAL_FUNCTION,
- CVAL_S_EXPRESSION, CVAL_Q_EXPRESSION, CVAL_STRING, CVAL_FLOAT
+ CVAL_S_EXPRESSION, CVAL_Q_EXPRESSION, CVAL_STRING, CVAL_FLOAT,
+ CVAL_BOOLEAN
};
struct cval {
@@ -22,7 +24,7 @@ struct cval {
char *err;
char *sym;
char *str;
- hash_table *ht;
+ bool boolean;
cbuiltin builtin;
cenv *env;
@@ -52,6 +54,8 @@ cval *cval_error(char *fmt, ...);
cval *cval_symbol(char *s);
+cval *cval_boolean(bool b);
+
cval *cval_s_expression(void);
cval *cval_q_expression(void);
diff --git a/src/main.c b/src/main.c
index 5bda1db..4c22238 100644
--- a/src/main.c
+++ b/src/main.c
@@ -29,6 +29,7 @@ void add_history(char* unused) {}
#endif
mpc_parser_t *Number;
mpc_parser_t *Float;
+mpc_parser_t *Boolean;
mpc_parser_t *Symbol;
mpc_parser_t *String;
mpc_parser_t *Comment;
@@ -471,10 +472,13 @@ cval *builtin_ne(cenv *e, cval *a) {
cval *builtin_if(cenv *e, cval *a) {
CASSERT_NUM("if", a, 3)
- CASSERT_TYPE("if", a, 0, CVAL_NUMBER)
- CASSERT_TYPE("if", a, 1, CVAL_Q_EXPRESSION)
+ CASSERT_TYPE("if", a, 1,CVAL_Q_EXPRESSION)
CASSERT_TYPE("if", a, 2, CVAL_Q_EXPRESSION)
+ if (a->cell[0]->type != CVAL_NUMBER) {
+ CASSERT_TYPE("if", a, 0, CVAL_BOOLEAN)
+ }
+
cval *x;
a->cell[1]->type = CVAL_S_EXPRESSION;
a->cell[2]->type = CVAL_S_EXPRESSION;
@@ -774,6 +778,12 @@ cval *builtin_type(cenv *e, cval *a) {
case CVAL_SYMBOL:
return cval_number(5);
+ case CVAL_FLOAT:
+ return cval_number(6);
+
+ case CVAL_BOOLEAN:
+ return cval_number(7);
+
default:
return cval_error("Type not defined!");
}
@@ -912,6 +922,7 @@ void load_standard_lib(cenv *e) {
int main(int argc, char **argv) {
Number = mpc_new("number");
Float = mpc_new("float");
+ Boolean = mpc_new("boolean");
Symbol = mpc_new("symbol");
Sexpr = mpc_new("sexpr");
Qexpr = mpc_new("qexpr");
@@ -921,20 +932,22 @@ int main(int argc, char **argv) {
Connery = mpc_new("connery");
mpca_lang(MPCA_LANG_DEFAULT,
- " \
- float : /-?[0-9]*\\.[0-9]+/ ; \
- number : /-?[0-9]+/ ; \
- symbol : /[a-zA-Z0-9_+\\-*\\/\\\\=<>!&]+/ \
- |'+' | '-' | '*' | '/' ; \
- sexpr : '(' * ')' ; \
- qexpr : '{' * '}' ; \
- string : /\"(\\\\.|[^\"])*\"/; \
- comment : /;[^\\r\\n]*/ ; \
- expr : | | \
- | | | | ;\
- connery : /^/ * /$/ ; \
+ " \
+ boolean : \"True\" | \"False\" ; \
+ float : /-?[0-9]*\\.[0-9]+/ ; \
+ number : /-?[0-9]+/ ; \
+ symbol : /[a-zA-Z0-9_+\\-*\\/\\\\=<>!&]+/ \
+ |'+' | '-' | '*' | '/' ; \
+ sexpr : '(' * ')' ; \
+ qexpr : '{' * '}' ; \
+ string : /\"(\\\\.|[^\"])*\"/; \
+ comment : /;[^\\r\\n]*/ ; \
+ expr : | | | \
+ | | | | ; \
+ connery : /^/ * /$/ ; \
",
- Float, Number, Symbol, Sexpr, Qexpr, Expr, String, Comment, Connery);
+ Boolean, Float, Number, Symbol, Sexpr, Qexpr, Expr, String,
+ Comment, Connery);
cenv *e = cenv_new();
cenv_add_builtins(e);
@@ -981,7 +994,7 @@ int main(int argc, char **argv) {
}
}
- mpc_cleanup(8, Number, Float, Symbol, String, Comment, Sexpr, Qexpr, Expr, Connery);
+ mpc_cleanup(10, Boolean, Number, Float, Symbol, String, Comment, Sexpr, Qexpr, Expr, Connery);
cenv_delete(e);
return 0;
}
\ No newline at end of file
diff --git a/src/stdlib/constants.connery b/src/stdlib/constants.connery
index 1537ced..d6eb4aa 100644
--- a/src/stdlib/constants.connery
+++ b/src/stdlib/constants.connery
@@ -1,8 +1,6 @@
; Constants
(def {None} {})
(def {Empty} "")
-(def {True} 1)
-(def {False} 0)
(def {Otherwise} True)
(def {std_lib_main_location} "stdlib/main.connery")
diff --git a/src/stdlib/types.connery b/src/stdlib/types.connery
index b159307..249d581 100644
--- a/src/stdlib/types.connery
+++ b/src/stdlib/types.connery
@@ -6,6 +6,8 @@
{(== i 3) "Q Expression"}
{(== i 4) "Function"}
{(== i 5) "Symbol"}
+ {(== i 6) "Float"}
+ {(== i 7) "Boolean"}
{(Otherwise) "Unknown"}
})
@@ -45,6 +47,18 @@
{False}
})
+(fun {is_float i} {
+ if (== 6 (type i))
+ {True}
+ {False}
+})
+
+(fun {is_bool i} {
+ if (== 7 (type i))
+ {True}
+ {False}
+})
+
(fun {type_string i} {
type_num (type i)
})
\ No newline at end of file
From 9c0110f7d6238ad167adb1be59ba54d1543b4937 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Tue, 25 Aug 2020 19:46:03 -0400
Subject: [PATCH 08/45] Improved boolean implementation
---
src/cval.c | 6 ------
src/main.c | 20 ++++++++++++++------
2 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 9c1ab63..617f3f7 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -112,12 +112,6 @@ cval* cval_boolean(bool b) {
cval* value = malloc(sizeof(cval));
value->type = CVAL_BOOLEAN;
value->boolean = b;
- if (b) {
- value->num = 1;
- }
- else {
- value->num = 0;
- }
value->count = 0;
value->cell = NULL;
return value;
diff --git a/src/main.c b/src/main.c
index 4c22238..db74a94 100644
--- a/src/main.c
+++ b/src/main.c
@@ -483,10 +483,18 @@ cval *builtin_if(cenv *e, cval *a) {
a->cell[1]->type = CVAL_S_EXPRESSION;
a->cell[2]->type = CVAL_S_EXPRESSION;
- if (a->cell[0]->num) {
- x = cval_evaluate(e, cval_pop(a, 1));
+ if (a->cell[0]->type == CVAL_BOOLEAN) {
+ if (a->cell[0]->boolean) {
+ x = cval_evaluate(e, cval_pop(a, 1));
+ } else {
+ x = cval_evaluate(e, cval_pop(a, 2));
+ }
} else {
- x = cval_evaluate(e, cval_pop(a, 2));
+ if (a->cell[0]->num) {
+ x = cval_evaluate(e, cval_pop(a, 1));
+ } else {
+ x = cval_evaluate(e, cval_pop(a, 2));
+ }
}
cval_delete(a);
@@ -622,7 +630,7 @@ cval *builtin_file(cenv *e, cval *a) {
if (success) {
fclose(file);
cval_delete(a);
- return cval_number(1);
+ return cval_boolean(true);
}
}
cval_delete(a);
@@ -640,7 +648,7 @@ cval *builtin_file(cenv *e, cval *a) {
if (success) {
fclose(file);
cval_delete(a);
- return cval_number(1);
+ return cval_boolean(true);
}
}
cval_delete(a);
@@ -688,7 +696,7 @@ cval *builtin_find(cenv *e, cval *a) {
return cval_number(pos - org);
} else {
cval_delete(a);
- return cval_number(0);
+ return cval_boolean(false);
}
}
From aebb82ffe6b1131babf57dd27c0eb9fea9c483d6 Mon Sep 17 00:00:00 2001
From: William Cipriano
Date: Wed, 26 Aug 2020 18:49:53 -0400
Subject: [PATCH 09/45] Improved dockerfile on Windows
---
Dockerfile | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index a3cbb8b..1a23667 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,4 +7,5 @@ RUN apt-get -y install libedit-dev
WORKDIR /Connery
COPY src/. .
RUN cmake .
-ENTRYPOINT "./cmake-build-debug/Connery" && /bin/bash
\ No newline at end of file
+RUN cmake --build .
+ENTRYPOINT "./Connery" && /bin/bash
\ No newline at end of file
From cb40119f366648e7e88b2d285675a2c48955a8f0 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Thu, 27 Aug 2020 20:36:54 -0400
Subject: [PATCH 10/45] Made is so booleans aren't triggered when they are a
part of symbols
---
src/cval.c | 13 ++++++++++++-
src/main.c | 10 +++-------
2 files changed, 15 insertions(+), 8 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 617f3f7..752a4da 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -480,6 +480,17 @@ cval* cval_read_string(mpc_ast_t* t) {
return str;
}
+cval* cval_read_symbol(char* symbol) {
+
+ if(strcmp(symbol, "True") == 0) {
+ return cval_boolean(true);
+ } else if (strcmp(symbol, "False") == 0) {
+ return cval_boolean(false);
+ } else {
+ return cval_symbol(symbol);
+ }
+}
+
cval* cval_read(mpc_ast_t* t) {
if (strstr(t->tag, "boolean")) {
@@ -494,7 +505,7 @@ cval* cval_read(mpc_ast_t* t) {
}
if (strstr(t->tag, "symbol")) {
- return cval_symbol(t->contents);
+ return cval_read_symbol(t->contents);
}
cval* x = NULL;
diff --git a/src/main.c b/src/main.c
index db74a94..484dbba 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,7 +5,6 @@
#include "mpc.h"
#include "util.h"
#include "cval.h"
-#include "hashtable.h"
#ifdef _WIN32
#include
@@ -29,7 +28,6 @@ void add_history(char* unused) {}
#endif
mpc_parser_t *Number;
mpc_parser_t *Float;
-mpc_parser_t *Boolean;
mpc_parser_t *Symbol;
mpc_parser_t *String;
mpc_parser_t *Comment;
@@ -930,7 +928,6 @@ void load_standard_lib(cenv *e) {
int main(int argc, char **argv) {
Number = mpc_new("number");
Float = mpc_new("float");
- Boolean = mpc_new("boolean");
Symbol = mpc_new("symbol");
Sexpr = mpc_new("sexpr");
Qexpr = mpc_new("qexpr");
@@ -941,7 +938,6 @@ int main(int argc, char **argv) {
mpca_lang(MPCA_LANG_DEFAULT,
" \
- boolean : \"True\" | \"False\" ; \
float : /-?[0-9]*\\.[0-9]+/ ; \
number : /-?[0-9]+/ ; \
symbol : /[a-zA-Z0-9_+\\-*\\/\\\\=<>!&]+/ \
@@ -950,11 +946,11 @@ int main(int argc, char **argv) {
qexpr : '{' * '}' ; \
string : /\"(\\\\.|[^\"])*\"/; \
comment : /;[^\\r\\n]*/ ; \
- expr : | | | \
+ expr : | | \
| | | | ; \
connery : /^/ * /$/ ; \
",
- Boolean, Float, Number, Symbol, Sexpr, Qexpr, Expr, String,
+ Float, Number, Symbol, Sexpr, Qexpr, Expr, String,
Comment, Connery);
cenv *e = cenv_new();
@@ -1002,7 +998,7 @@ int main(int argc, char **argv) {
}
}
- mpc_cleanup(10, Boolean, Number, Float, Symbol, String, Comment, Sexpr, Qexpr, Expr, Connery);
+ mpc_cleanup(9, Number, Float, Symbol, String, Comment, Sexpr, Qexpr, Expr, Connery);
cenv_delete(e);
return 0;
}
\ No newline at end of file
From f56448598b4a07733bca3afaa42bf40e7c4aba1e Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Fri, 28 Aug 2020 21:44:26 -0400
Subject: [PATCH 11/45] added exit
---
src/main.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/main.c b/src/main.c
index 484dbba..2fb41f9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -874,6 +874,17 @@ cval *builtin_input(cenv *e, cval *a) {
return cval_string(input);
}
+cval *builtin_exit(cenv* e, cval *a) {
+ CASSERT_TYPE("exit", a, 0, CVAL_NUMBER);
+
+ int exit_code = a->cell[0]->num;
+ cval_delete(a);
+
+ mpc_cleanup(9, Number, Float, Symbol, String, Comment, Sexpr, Qexpr, Expr, Connery);
+ cenv_delete(e);
+ exit(exit_code);
+}
+
void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "\\", builtin_lambda);
@@ -915,6 +926,7 @@ void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "http", builtin_http);
cenv_add_builtin(e, "file", builtin_file);
+ cenv_add_builtin(e, "exit", builtin_exit);
}
void load_standard_lib(cenv *e) {
From 95e133ecd46cd5a1a1e12a660bf5d616e582ca74 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Mon, 31 Aug 2020 19:27:56 -0400
Subject: [PATCH 12/45] Fixed logic.connery to work with booleans, working on
adding q package manager
---
src/main.c | 3 +-
src/stdlib/Q.connery | 3 ++
src/stdlib/calendar.connery | 60 -----------------------------------
src/stdlib/csv.connery | 3 ++
src/stdlib/functional.connery | 8 +++++
src/stdlib/lists.connery | 2 +-
src/stdlib/logic.connery | 24 ++++++++++++--
src/stdlib/main.connery | 2 +-
8 files changed, 38 insertions(+), 67 deletions(-)
create mode 100644 src/stdlib/Q.connery
delete mode 100644 src/stdlib/calendar.connery
create mode 100644 src/stdlib/csv.connery
diff --git a/src/main.c b/src/main.c
index 2fb41f9..52d6d5f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -851,6 +851,7 @@ cval *builtin_http(cenv *e, cval *a) {
multi_tok_t x = multiTok_init();
char *header = multi_tok(headers, &x, "\r\n");
+
while (header != NULL) {
cval_add(headers_list, cval_string(header));
header = multi_tok(NULL, &x, "\r\n");
@@ -885,7 +886,6 @@ cval *builtin_exit(cenv* e, cval *a) {
exit(exit_code);
}
-
void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "\\", builtin_lambda);
cenv_add_builtin(e, "def", builtin_def);
@@ -924,7 +924,6 @@ void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "print", builtin_print);
cenv_add_builtin(e, "type", builtin_type);
cenv_add_builtin(e, "http", builtin_http);
-
cenv_add_builtin(e, "file", builtin_file);
cenv_add_builtin(e, "exit", builtin_exit);
}
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
new file mode 100644
index 0000000..77ba119
--- /dev/null
+++ b/src/stdlib/Q.connery
@@ -0,0 +1,3 @@
+(def {Q package_name} {
+ (print "attempting to pull package")
+})
\ No newline at end of file
diff --git a/src/stdlib/calendar.connery b/src/stdlib/calendar.connery
deleted file mode 100644
index a6e75d7..0000000
--- a/src/stdlib/calendar.connery
+++ /dev/null
@@ -1,60 +0,0 @@
-(fun {weekday_num i} {
- case
- {(== i 0) "Monday"}
- {(== i 1) "Tuesday"}
- {(== i 2) "Wednesday"}
- {(== i 3) "Thursday"}
- {(== i 4) "Friday"}
- {(== i 5) "Saturday"}
- {(== i 6) "Sunday"}
- {Otherwise (error "Weekday num is undefined")}
-})
-
-(fun {month_num i} {
- case
- {(== i 0) "January"}
- {(== i 1) "February"}
- {(== i 2) "March"}
- {(== i 3) "April"}
- {(== i 4) "May"}
- {(== i 5) "June"}
- {(== i 6) "July"}
- {(== i 7) "August"}
- {(== i 8) "September"}
- {(== i 9) "October"}
- {(== i 10) "November"}
- {(== i 11) "December"}
- {(Otherwise) (error "Month num is undefined")}
-})
-
-(fun {month_day_count month year} {
- case
- {(== month 0) 31}
- {(== month 1) (if (is_leap_year year) {29} {28})}
- {(== month 2) 31}
- {(== month 3) 30}
- {(== month 4) 31}
- {(== month 5) 30}
- {(== month 6) 31}
- {(== month 7) 31}
- {(== month 8) 30}
- {(== month 9) 31}
- {(== month 10) 30}
- {(== month 11) 31}
- {(Otherwise) (error "Month num is undefined")}
-})
-
-(fun {is_leap_year year} {
- if (is_num year) {
- if (== 0 (mod year 4))
- {
- if (== 0 (mod year 100))
- {
- if (== 0 (mod year 400))
- {True}
- {False}
- }
- {True}
- }
- {False}}
- {error "is_leap_year requiresh a number ash input!"}})
diff --git a/src/stdlib/csv.connery b/src/stdlib/csv.connery
new file mode 100644
index 0000000..0898528
--- /dev/null
+++ b/src/stdlib/csv.connery
@@ -0,0 +1,3 @@
+(fun {parse_csv csv} {
+ (delimit "," (delimit "\n" csv))
+})
\ No newline at end of file
diff --git a/src/stdlib/functional.connery b/src/stdlib/functional.connery
index 2c1623b..e0ed151 100644
--- a/src/stdlib/functional.connery
+++ b/src/stdlib/functional.connery
@@ -5,3 +5,11 @@
; flipargs
(fun {flipargs f a b} {f b a})
+
+(fun {case & cs} {
+ if (== cs None)
+ {None}
+ {if (first (first cs))
+ {second (first cs)}
+ {unpack case (tail cs)}}
+})
\ No newline at end of file
diff --git a/src/stdlib/lists.connery b/src/stdlib/lists.connery
index 7d3e290..0bf7554 100644
--- a/src/stdlib/lists.connery
+++ b/src/stdlib/lists.connery
@@ -16,7 +16,7 @@
;third - get third item of a list
;usage: third List
(fun {third l} {
- if (is_qexpr l)
+ if (or (is_qexpr l) (is_sexpr l))
{eval (head (tail (tail l))) }
{error "third requiresh a lisht ash input!"}
})
diff --git a/src/stdlib/logic.connery b/src/stdlib/logic.connery
index ad4bec9..a331de7 100644
--- a/src/stdlib/logic.connery
+++ b/src/stdlib/logic.connery
@@ -1,3 +1,21 @@
-(fun {not x} {- 1 x})
-(fun {or x y} {+ x y})
-(fun {and x y} {* x y})
\ No newline at end of file
+(fun {not x} {
+ if (x)
+ {False}
+ {True}
+})
+
+(fun {or x y} {
+ if (x)
+ {True}
+ {if (y)
+ {True}
+ {False}}
+ })
+
+(fun {and x y} {
+ if (x)
+ {if (y)
+ {True}
+ {False}}
+ {False}
+})
\ No newline at end of file
diff --git a/src/stdlib/main.connery b/src/stdlib/main.connery
index 06638f7..a410c0a 100644
--- a/src/stdlib/main.connery
+++ b/src/stdlib/main.connery
@@ -7,4 +7,4 @@
(load "stdlib/strings.connery")
(load "stdlib/io.connery")
(load "stdlib/http.connery")
-(load "stdlib/calendar.connery")
\ No newline at end of file
+(load "stdlib/csv.connery")
\ No newline at end of file
From 9d54257c863674814da88be7cd9f5e686d6f1a83 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Mon, 31 Aug 2020 19:55:11 -0400
Subject: [PATCH 13/45] Added csv parser
---
src/cval.c | 4 ++++
src/stdlib/csv.connery | 10 ++++++++--
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 752a4da..bb4a4de 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -251,6 +251,10 @@ cval* cval_copy(cval* v) {
x->str = malloc(strlen(v->str) + 1);
strcpy(x->str, v->str);
break;
+
+ case CVAL_BOOLEAN:
+ x->boolean = v->boolean;
+ break;
}
return x;
diff --git a/src/stdlib/csv.connery b/src/stdlib/csv.connery
index 0898528..d0876e7 100644
--- a/src/stdlib/csv.connery
+++ b/src/stdlib/csv.connery
@@ -1,3 +1,9 @@
-(fun {parse_csv csv} {
- (delimit "," (delimit "\n" csv))
+(fun {__parse_csv_loop__ csv_lines output}{
+ if (== 0 (length csv_lines))
+ {output}
+ {__parse_csv_loop__ (tail csv_lines) (join output (list (delimit "," (eval (head csv_lines)))))}
+})
+
+(fun {csv csv_string} {
+ __parse_csv_loop__ (delimit "\n" csv_string) None
})
\ No newline at end of file
From ac257ce825d9ba21f5ac46e57df1c6439d3890f5 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Tue, 1 Sep 2020 17:18:36 -0400
Subject: [PATCH 14/45] Working on package management
---
src/stdlib/Q.connery | 22 ++++++++++++++++++++--
src/stdlib/main.connery | 3 ++-
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 77ba119..4e47509 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -1,3 +1,21 @@
-(def {Q package_name} {
- (print "attempting to pull package")
+(def {__Q_packages__} False)
+(def {__Q_package_list_url__} "http://q.connerylang.org/packages/packages_list.csv")
+
+
+(fun {__Q_get_packages__ refresh} {
+ if (or __Q_packages__ refresh)
+ {def {__Q_packages__} (tail (csv (third (http_get __Q_package_list_url__))))}
+ {False}
+})
+
+(fun {__Q_package_scan__ packages package_name} {
+ if (>= (length packages) 1)
+ {if (== (first (first (head packages))) package_name)
+ {first (head packages)}
+ {__Q_package_scan__ (tail packages) package_name}}
+ {False}
+})
+
+(fun {Q package_name} {
+ print "OK"
})
\ No newline at end of file
diff --git a/src/stdlib/main.connery b/src/stdlib/main.connery
index a410c0a..b5737fd 100644
--- a/src/stdlib/main.connery
+++ b/src/stdlib/main.connery
@@ -7,4 +7,5 @@
(load "stdlib/strings.connery")
(load "stdlib/io.connery")
(load "stdlib/http.connery")
-(load "stdlib/csv.connery")
\ No newline at end of file
+(load "stdlib/csv.connery")
+(load "stdlib/Q.connery")
\ No newline at end of file
From 65d62f50bb8227cbabacc02d96f19fbf52848fb1 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:11:37 -0400
Subject: [PATCH 15/45] Added chkdir and mkdir
---
src/main.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/stdlib/Q.connery | 6 +++---
src/util.c | 25 +++++++++++++++++++++++++
src/util.h | 3 +++
4 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/src/main.c b/src/main.c
index 52d6d5f..0738f6f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -24,6 +24,7 @@ void add_history(char* unused) {}
#else
#include
+#include
#endif
mpc_parser_t *Number;
@@ -886,6 +887,44 @@ cval *builtin_exit(cenv* e, cval *a) {
exit(exit_code);
}
+cval *builtin_mkdir(cenv* e, cval *a) {
+ CASSERT_NUM("mkdir", a, 1);
+ CASSERT_TYPE("mkdir", a, 0, CVAL_STRING);
+ char *path = a->cell[0]->str;
+ struct stat st = {0};
+ int result;
+
+ if (stat(path, &st) == -1) {
+ result = mkpath(path, 0700);
+ } else {
+ result = -1;
+ }
+
+ cval_delete(a);
+
+ if (result == 1) {
+ return cval_boolean(true);
+ } else {
+ return cval_boolean(false);
+ }
+}
+
+cval *builtin_chkdir(cenv* e,cval* a) {
+ CASSERT_NUM("chkdir", a, 1);
+ CASSERT_TYPE("chkdir", a, 0, CVAL_STRING);
+ struct stat st = {0};
+
+ char *path = a->cell[0]->str;
+
+ if (stat(path, &st) == -1) {
+ cval_delete(a);
+ return cval_boolean(false);
+ } else {
+ cval_delete(a);
+ return cval_boolean(true);
+ }
+}
+
void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "\\", builtin_lambda);
cenv_add_builtin(e, "def", builtin_def);
@@ -926,6 +965,9 @@ void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "http", builtin_http);
cenv_add_builtin(e, "file", builtin_file);
cenv_add_builtin(e, "exit", builtin_exit);
+
+ cenv_add_builtin(e, "mkdir", builtin_mkdir);
+ cenv_add_builtin(e, "chkdir", builtin_chkdir);
}
void load_standard_lib(cenv *e) {
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 4e47509..4b7e7e9 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -1,10 +1,10 @@
(def {__Q_packages__} False)
-(def {__Q_package_list_url__} "http://q.connerylang.org/packages/packages_list.csv")
-
+(def {__Q_location__} "http://q.connerylang.org")
+(def {__Q_package_list_url_slug__} "/packages/packages_list.csv")
(fun {__Q_get_packages__ refresh} {
if (or __Q_packages__ refresh)
- {def {__Q_packages__} (tail (csv (third (http_get __Q_package_list_url__))))}
+ {def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__)))))}
{False}
})
diff --git a/src/util.c b/src/util.c
index e0f4ca1..cb5dfe7 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1,6 +1,9 @@
#include
#include
#include
+#include
+#include
+#include
#include "util.h"
void init_http_response(struct http_response *s) {
@@ -125,3 +128,25 @@ long get_factor(int init_digits) {
return -1;
}
}
+
+int mkpath(const char *path, mode_t mode)
+{
+ char tmp[PATH_MAX];
+ char *p = NULL;
+ size_t len;
+
+ snprintf(tmp, sizeof(tmp),"%s",path);
+ len = strlen(tmp);
+ if(tmp[len - 1] == '/')
+ tmp[len - 1] = 0;
+ for(p = tmp + 1; *p; p++)
+ if(*p == '/') {
+ *p = 0;
+ if (mkdir(tmp, mode) < 0 && errno != EEXIST)
+ return -1;
+ *p = '/';
+ }
+ if (mkdir(tmp, mode) < 0 && errno != EEXIST)
+ return -1;
+ return 1;
+}
diff --git a/src/util.h b/src/util.h
index 1a2cffa..4f3202a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -24,4 +24,7 @@ long long_power(long x,long exponent);
int count_digits(long n);
long get_factor(int init_digits);
+//mkpath
+int mkpath(const char *path, mode_t mode);
+
#endif //CONNERY_UTIL_H
From fa01cfe9f7d844fbd5d23a8a123b4709509282c7 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:30:50 -0400
Subject: [PATCH 16/45] Made mkpath work on Windows
---
src/util.c | 68 +++++++++++++++++++++++++++++-------------------------
1 file changed, 36 insertions(+), 32 deletions(-)
diff --git a/src/util.c b/src/util.c
index cb5dfe7..b6c3d66 100644
--- a/src/util.c
+++ b/src/util.c
@@ -8,7 +8,7 @@
void init_http_response(struct http_response *s) {
s->len = 0;
- s->body = malloc(s->len+1);
+ s->body = malloc(s->len + 1);
if (s->body == NULL) {
fprintf(stderr, "malloc() failed\n");
exit(EXIT_FAILURE);
@@ -16,19 +16,18 @@ void init_http_response(struct http_response *s) {
s->body[0] = '\0';
}
-size_t http_response_writer(void *ptr, size_t size, size_t nmemb, struct http_response *s)
-{
- size_t new_len = s->len + size*nmemb;
- s->body = realloc(s->body, new_len+1);
+size_t http_response_writer(void *ptr, size_t size, size_t nmemb, struct http_response *s) {
+ size_t new_len = s->len + size * nmemb;
+ s->body = realloc(s->body, new_len + 1);
if (s->body == NULL) {
fprintf(stderr, "realloc() failed\n");
exit(EXIT_FAILURE);
}
- memcpy(s->body+s->len, ptr, size*nmemb);
+ memcpy(s->body + s->len, ptr, size * nmemb);
s->body[new_len] = '\0';
s->len = new_len;
- return size*nmemb;
+ return size * nmemb;
}
typedef char *multi_tok_t;
@@ -69,17 +68,15 @@ char *concatenateThree(const char *a, const char *b, const char *c) {
return res;
}
-long long_power(long x,long exponent)
-{
+long long_power(long x, long exponent) {
int i;
int number = 1;
for (i = 0; i < exponent; ++i)
number *= x;
- return(number);
+ return (number);
}
-int count_digits(long n)
-{
+int count_digits(long n) {
if (n == 0)
return 0;
return 1 + count_digits(n / 10);
@@ -129,24 +126,31 @@ long get_factor(int init_digits) {
}
}
-int mkpath(const char *path, mode_t mode)
-{
- char tmp[PATH_MAX];
- char *p = NULL;
- size_t len;
-
- snprintf(tmp, sizeof(tmp),"%s",path);
- len = strlen(tmp);
- if(tmp[len - 1] == '/')
- tmp[len - 1] = 0;
- for(p = tmp + 1; *p; p++)
- if(*p == '/') {
- *p = 0;
- if (mkdir(tmp, mode) < 0 && errno != EEXIST)
- return -1;
- *p = '/';
- }
- if (mkdir(tmp, mode) < 0 && errno != EEXIST)
- return -1;
- return 1;
+int mkpath(const char *path, mode_t mode) {
+ char tmp[PATH_MAX];
+ char *p = NULL;
+ size_t len;
+
+ snprintf(tmp, sizeof(tmp), "%s", path);
+ len = strlen(tmp);
+ if (tmp[len - 1] == '/')
+ tmp[len - 1] = 0;
+ for (p = tmp + 1; *p; p++)
+ if (*p == '/') {
+ *p = 0;
+#if defined(_WIN32)
+ if (_mkdir(tmp, mode) < 0 && errno != EEXIST)
+#else
+ if (mkdir(tmp, mode) < 0 && errno != EEXIST)
+#endif
+ return -1;
+ *p = '/';
+ }
+#if defined(_WIN32)
+ if (_mkdir(tmp, mode) < 0 && errno != EEXIST)
+#else
+ if (mkdir(tmp, mode) < 0 && errno != EEXIST)
+#endif
+ return -1;
+ return 1;
}
From 8db7039df0b1263cc6a96ed7d8e9f767b40c5bb1 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:32:04 -0400
Subject: [PATCH 17/45] Removed mode from Windows calls to mkdir
---
src/util.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/util.c b/src/util.c
index b6c3d66..c60cc83 100644
--- a/src/util.c
+++ b/src/util.c
@@ -139,7 +139,7 @@ int mkpath(const char *path, mode_t mode) {
if (*p == '/') {
*p = 0;
#if defined(_WIN32)
- if (_mkdir(tmp, mode) < 0 && errno != EEXIST)
+ if (_mkdir(tmp) < 0 && errno != EEXIST)
#else
if (mkdir(tmp, mode) < 0 && errno != EEXIST)
#endif
@@ -147,7 +147,7 @@ int mkpath(const char *path, mode_t mode) {
*p = '/';
}
#if defined(_WIN32)
- if (_mkdir(tmp, mode) < 0 && errno != EEXIST)
+ if (_mkdir(tmp) < 0 && errno != EEXIST)
#else
if (mkdir(tmp, mode) < 0 && errno != EEXIST)
#endif
From eddf20c0471dd04d12c66fd2f0edf99e2a0cd842 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:33:07 -0400
Subject: [PATCH 18/45] Format cval.c
---
src/cval.c | 262 ++++++++++++++++++++++++++++-------------------------
1 file changed, 139 insertions(+), 123 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index bb4a4de..9dd0eda 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -24,92 +24,104 @@ if (!(cond)) {\
func, args->count, num)
-cval* cval_pop(cval* value, int i);
-cval* cval_evaluate(cenv* env,cval* value);
-cval* cval_take(cval* value, int i);
-
-char* ctype_name(int t) {
- switch(t) {
- case CVAL_FUNCTION: return "Function";
- case CVAL_NUMBER: return "Number";
- case CVAL_ERROR: return "Error";
- case CVAL_SYMBOL: return "Symbol";
- case CVAL_S_EXPRESSION: return "S-Expression";
- case CVAL_Q_EXPRESSION: return "Q-Expression";
- case CVAL_STRING: return "String";
- case CVAL_FLOAT: return "Float";
- case CVAL_BOOLEAN: return "Boolean";
- default: return "Unknown Type";
- }
-}
-
-cval* cval_function(cbuiltin func) {
- cval* v = malloc(sizeof(cval));
+cval *cval_pop(cval *value, int i);
+
+cval *cval_evaluate(cenv *env, cval *value);
+
+cval *cval_take(cval *value, int i);
+
+char *ctype_name(int t) {
+ switch (t) {
+ case CVAL_FUNCTION:
+ return "Function";
+ case CVAL_NUMBER:
+ return "Number";
+ case CVAL_ERROR:
+ return "Error";
+ case CVAL_SYMBOL:
+ return "Symbol";
+ case CVAL_S_EXPRESSION:
+ return "S-Expression";
+ case CVAL_Q_EXPRESSION:
+ return "Q-Expression";
+ case CVAL_STRING:
+ return "String";
+ case CVAL_FLOAT:
+ return "Float";
+ case CVAL_BOOLEAN:
+ return "Boolean";
+ default:
+ return "Unknown Type";
+ }
+}
+
+cval *cval_function(cbuiltin func) {
+ cval *v = malloc(sizeof(cval));
v->type = CVAL_FUNCTION;
v->builtin = func;
return v;
}
-cval* cval_number(long x) {
- cval* value = malloc(sizeof(cval));
+cval *cval_number(long x) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_NUMBER;
value->num = x;
return value;
}
-cval* cval_float(long double x) {
- cval* value = malloc(sizeof(cval));
+cval *cval_float(long double x) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_FLOAT;
value->fnum = x;
return value;
}
-cval* cval_string (char* s) {
- cval* v = malloc(sizeof(cval));
+cval *cval_string(char *s) {
+ cval *v = malloc(sizeof(cval));
v->type = CVAL_STRING;
v->str = malloc(strlen(s) + 1);
strcpy(v->str, s);
return v;
}
-cval* cval_error(char* fmt, ...) {
- cval* value = malloc(sizeof(cval));
+cval *cval_error(char *fmt, ...) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_ERROR;
va_list va;
va_start(va, fmt);
value->err = malloc(512);
vsnprintf(value->err, 511, fmt, va);
- value->err = realloc(value->err, strlen(value->err)+1);
+ value->err = realloc(value->err, strlen(value->err) + 1);
va_end(va);
return value;
}
-cval* cval_symbol(char* s) {
- cval* value = malloc(sizeof(cval));
+cval *cval_symbol(char *s) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_SYMBOL;
value->sym = malloc(strlen(s) + 1);
strcpy(value->sym, s);
return value;
}
-cval* cval_s_expression(void) {
- cval* value = malloc(sizeof(cval));
+cval *cval_s_expression(void) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_S_EXPRESSION;
value->count = 0;
value->cell = NULL;
return value;
}
-cval* cval_q_expression(void) {
- cval* value = malloc(sizeof(cval));
+cval *cval_q_expression(void) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_Q_EXPRESSION;
value->count = 0;
value->cell = NULL;
return value;
}
-cval* cval_boolean(bool b) {
- cval* value = malloc(sizeof(cval));
+cval *cval_boolean(bool b) {
+ cval *value = malloc(sizeof(cval));
value->type = CVAL_BOOLEAN;
value->boolean = b;
value->count = 0;
@@ -118,20 +130,20 @@ cval* cval_boolean(bool b) {
}
-cenv* cenv_new(void) {
- cenv* e = malloc(sizeof(cenv));
+cenv *cenv_new(void) {
+ cenv *e = malloc(sizeof(cenv));
e->par = NULL;
e->ht = hash_table_create(ENV_HASH_TABLE_SIZE);
return e;
}
-void cenv_delete(cenv* e) {
+void cenv_delete(cenv *e) {
hash_table_destroy(e->ht);
free(e);
}
-void cval_delete(cval* value) {
- switch(value->type) {
+void cval_delete(cval *value) {
+ switch (value->type) {
case CVAL_NUMBER:
break;
@@ -171,41 +183,41 @@ void cval_delete(cval* value) {
free(value);
}
-cval* cval_take(cval* value, int i) {
- cval* x = cval_pop(value, i);
+cval *cval_take(cval *value, int i) {
+ cval *x = cval_pop(value, i);
cval_delete(value);
return x;
}
-cval* cval_pop(cval* value, int i) {
- cval* x = value->cell[i];
- memmove(&value->cell[i], &value->cell[i+1],
- sizeof(cval*) * (value->count-i-1));
+cval *cval_pop(cval *value, int i) {
+ cval *x = value->cell[i];
+ memmove(&value->cell[i], &value->cell[i + 1],
+ sizeof(cval *) * (value->count - i - 1));
value->count--;
- value->cell = realloc(value->cell, sizeof(cval*) * value->count);
+ value->cell = realloc(value->cell, sizeof(cval *) * value->count);
return x;
}
-cval* builtin_eval(cenv* e, cval* a) {
+cval *builtin_eval(cenv *e, cval *a) {
CASSERT_NUM("eval", a, 1);
CASSERT_TYPE("eval", a, 0, CVAL_Q_EXPRESSION);
- cval* x = cval_take(a, 0);
+ cval *x = cval_take(a, 0);
x->type = CVAL_S_EXPRESSION;
return cval_evaluate(e, x);
}
-cenv* cenv_copy(cenv* e) {
- cenv* n = malloc(sizeof(cenv));
+cenv *cenv_copy(cenv *e) {
+ cenv *n = malloc(sizeof(cenv));
n->par = e->par;
n->ht = hash_table_copy(e->ht);
return n;
}
-cval* cval_copy(cval* v) {
- cval* x = malloc(sizeof(cval));
+cval *cval_copy(cval *v) {
+ cval *x = malloc(sizeof(cval));
x->type = v->type;
switch (v->type) {
@@ -241,7 +253,7 @@ cval* cval_copy(cval* v) {
case CVAL_S_EXPRESSION:
case CVAL_Q_EXPRESSION:
x->count = v->count;
- x->cell = malloc(sizeof(cval*) * x->count);
+ x->cell = malloc(sizeof(cval *) * x->count);
for (int i = 0; i < x->count; i++) {
x->cell[i] = cval_copy(v->cell[i]);
}
@@ -260,36 +272,36 @@ cval* cval_copy(cval* v) {
return x;
}
-void cenv_put(cenv* e, cval* k, cval* v) {
+void cenv_put(cenv *e, cval *k, cval *v) {
hash_table_set(e->ht, k->sym, v);
}
-cval* builtin_list(cenv* e, cval* a) {
+cval *builtin_list(cenv *e, cval *a) {
a->type = CVAL_Q_EXPRESSION;
return a;
}
-cval* cval_add(cval* v, cval* x) {
+cval *cval_add(cval *v, cval *x) {
v->count++;
- v->cell = realloc(v->cell, sizeof(cval*) * v->count);
- v->cell[v->count-1] = x;
+ v->cell = realloc(v->cell, sizeof(cval *) * v->count);
+ v->cell[v->count - 1] = x;
return v;
}
-cval* cval_call(cenv* e, cval* f, cval* a) {
- if (f->builtin) {return f->builtin(e, a);}
+cval *cval_call(cenv *e, cval *f, cval *a) {
+ if (f->builtin) { return f->builtin(e, a); }
int given = a->count;
int total = f->formals->count;
while (a->count) {
- if(f->formals->count == 0) {
+ if (f->formals->count == 0) {
cval_delete(a);
return cval_error("Function pashed too many argumentsh. Got %i, Expected %s", given, total);
}
- cval* sym = cval_pop(f->formals, 0);
+ cval *sym = cval_pop(f->formals, 0);
if (strcmp(sym->sym, "&") == 0) {
@@ -298,14 +310,14 @@ cval* cval_call(cenv* e, cval* f, cval* a) {
return cval_error("Function format invalid. shymbol '&' not followed by shingle shymbol.");
}
- cval* nsym = cval_pop(f->formals, 0);
+ cval *nsym = cval_pop(f->formals, 0);
cenv_put(f->env, nsym, builtin_list(e, a));
cval_delete(sym);
cval_delete(nsym);
break;
}
- cval* val = cval_pop(a, 0);
+ cval *val = cval_pop(a, 0);
cenv_put(f->env, sym, val);
cval_delete(sym);
@@ -322,8 +334,8 @@ cval* cval_call(cenv* e, cval* f, cval* a) {
cval_delete(cval_pop(f->formals, 0));
- cval* sym = cval_pop(f->formals, 0);
- cval* val = cval_q_expression();
+ cval *sym = cval_pop(f->formals, 0);
+ cval *val = cval_q_expression();
cenv_put(f->env, sym, val);
cval_delete(sym);
@@ -333,20 +345,19 @@ cval* cval_call(cenv* e, cval* f, cval* a) {
if (f->formals->count == 0) {
f->env->par = e;
return builtin_eval(f->env, cval_add(cval_s_expression(), cval_copy(f->body)));
- }
- else {
+ } else {
return cval_copy(f);
}
}
-cval* cval_evaluate_s_expression(cenv* env, cval* value) {
+cval *cval_evaluate_s_expression(cenv *env, cval *value) {
for (int i = 0; i < value->count; i++) {
value->cell[i] = cval_evaluate(env, value->cell[i]);
}
for (int i = 0; i < value->count; i++) {
- if (value->cell[i]->type == CVAL_ERROR) {return cval_take(value, i);}
+ if (value->cell[i]->type == CVAL_ERROR) { return cval_take(value, i); }
}
if (value->count == 0) {
@@ -357,21 +368,22 @@ cval* cval_evaluate_s_expression(cenv* env, cval* value) {
return cval_evaluate(env, cval_take(value, 0));
}
- cval* f = cval_pop(value, 0);
+ cval *f = cval_pop(value, 0);
if (f->type != CVAL_FUNCTION) {
- cval* err = cval_error("S-Expression starts with incorrect type. Got %s, Expected %s", ctype_name(f->type), ctype_name(CVAL_FUNCTION));
+ cval *err = cval_error("S-Expression starts with incorrect type. Got %s, Expected %s", ctype_name(f->type),
+ ctype_name(CVAL_FUNCTION));
cval_delete(f);
cval_delete(value);
return err;
}
- cval* result = cval_call(env, f, value);
+ cval *result = cval_call(env, f, value);
cval_delete(f);
return result;
}
-cval* cenv_get(cenv* e, cval* k) {
- cval* value = hash_table_get(e->ht, k->sym);
+cval *cenv_get(cenv *e, cval *k) {
+ cval *value = hash_table_get(e->ht, k->sym);
if (value != NULL) {
return cval_copy(value);
}
@@ -383,9 +395,9 @@ cval* cenv_get(cenv* e, cval* k) {
}
}
-cval* cval_evaluate(cenv* env, cval* value) {
+cval *cval_evaluate(cenv *env, cval *value) {
if (value->type == CVAL_SYMBOL) {
- cval* x = cenv_get(env, value);
+ cval *x = cenv_get(env, value);
cval_delete(value);
return x;
}
@@ -396,38 +408,40 @@ cval* cval_evaluate(cenv* env, cval* value) {
return value;
}
-void cenv_add_builtin(cenv* e, char* name, cbuiltin func) {
- cval* k = cval_symbol(name);
- cval* v = cval_function(func);
+void cenv_add_builtin(cenv *e, char *name, cbuiltin func) {
+ cval *k = cval_symbol(name);
+ cval *v = cval_function(func);
cenv_put(e, k, v);
cval_delete(k);
cval_delete(v);
}
-void cenv_def(cenv* e, cval* k, cval* v) {
+void cenv_def(cenv *e, cval *k, cval *v) {
while (e->par) {
e = e->par;
}
- cenv_put(e, k , v);
+ cenv_put(e, k, v);
}
-cval* builtin_var(cenv* e, cval* a, char* func) {
+cval *builtin_var(cenv *e, cval *a, char *func) {
CASSERT_TYPE("def", a, 0, CVAL_Q_EXPRESSION)
- cval* syms = a->cell[0];
+ cval *syms = a->cell[0];
for (int i = 0; i < syms->count; i++) {
CASSERT_TYPE("def", syms, i, CVAL_SYMBOL)
}
- CASSERT(a, (syms->count == a->count-1), "Function '%s' pashed too many arguments for symbols. Got %i, Expected %i", func, syms->count, a->count-1);
+ CASSERT(a, (syms->count == a->count - 1),
+ "Function '%s' pashed too many arguments for symbols. Got %i, Expected %i", func, syms->count,
+ a->count - 1);
for (int i = 0; i < syms->count; i++) {
if (strcmp(func, "def") == 0) {
- cenv_def(e, syms->cell[i], a->cell[i+1]);
+ cenv_def(e, syms->cell[i], a->cell[i + 1]);
}
if (strcmp(func, "=") == 0) {
- cenv_put(e, syms->cell[i], a->cell[i+1]);
+ cenv_put(e, syms->cell[i], a->cell[i + 1]);
}
}
@@ -435,15 +449,15 @@ cval* builtin_var(cenv* e, cval* a, char* func) {
return cval_s_expression();
}
-cval* builtin_put(cenv* e, cval* a) {
+cval *builtin_put(cenv *e, cval *a) {
return builtin_var(e, a, "=");
}
-cval* builtin_def(cenv* e, cval* a) {
+cval *builtin_def(cenv *e, cval *a) {
return builtin_var(e, a, "def");
}
-cval* cval_join(cval* x, cval* y) {
+cval *cval_join(cval *x, cval *y) {
for (int i = 0; i < y->count; i++) {
x = cval_add(x, y->cell[i]);
}
@@ -453,40 +467,40 @@ cval* cval_join(cval* x, cval* y) {
return x;
}
-cval* cval_read_boolean(mpc_ast_t* t) {
- if(strstr(t->contents, "True")) {
+cval *cval_read_boolean(mpc_ast_t *t) {
+ if (strstr(t->contents, "True")) {
return cval_boolean(true);
}
return cval_boolean(false);
}
-cval* cval_read_num(mpc_ast_t* t) {
+cval *cval_read_num(mpc_ast_t *t) {
errno = 0;
long x = strtol(t->contents, NULL, 10);
return errno != ERANGE ?
cval_number(x) : cval_error("that'sh an invalid number");
}
-cval* cval_read_float(mpc_ast_t* t) {
+cval *cval_read_float(mpc_ast_t *t) {
errno = 0;
long double x = strtold(t->contents, NULL);
return errno != ERANGE ?
cval_float(x) : cval_error("that'sh a invalid float");
}
-cval* cval_read_string(mpc_ast_t* t) {
- t->contents[strlen(t->contents)-1] = '\0';
- char* unescaped = malloc(strlen(t->contents+1)+1);
- strcpy(unescaped, t->contents+1);
+cval *cval_read_string(mpc_ast_t *t) {
+ t->contents[strlen(t->contents) - 1] = '\0';
+ char *unescaped = malloc(strlen(t->contents + 1) + 1);
+ strcpy(unescaped, t->contents + 1);
unescaped = mpcf_unescape(unescaped);
- cval* str = cval_string(unescaped);
+ cval *str = cval_string(unescaped);
free(unescaped);
return str;
}
-cval* cval_read_symbol(char* symbol) {
+cval *cval_read_symbol(char *symbol) {
- if(strcmp(symbol, "True") == 0) {
+ if (strcmp(symbol, "True") == 0) {
return cval_boolean(true);
} else if (strcmp(symbol, "False") == 0) {
return cval_boolean(false);
@@ -495,7 +509,7 @@ cval* cval_read_symbol(char* symbol) {
}
}
-cval* cval_read(mpc_ast_t* t) {
+cval *cval_read(mpc_ast_t *t) {
if (strstr(t->tag, "boolean")) {
return cval_read_boolean(t);
@@ -512,7 +526,7 @@ cval* cval_read(mpc_ast_t* t) {
return cval_read_symbol(t->contents);
}
- cval* x = NULL;
+ cval *x = NULL;
if (strcmp(t->tag, ">") == 0) {
x = cval_s_expression();
}
@@ -527,22 +541,22 @@ cval* cval_read(mpc_ast_t* t) {
}
for (int i = 0; i < t->children_num; i++) {
- if (strcmp(t->children[i]->contents, "(") == 0){
+ if (strcmp(t->children[i]->contents, "(") == 0) {
continue;
}
if (strstr(t->children[i]->tag, "comment")) {
continue;
}
- if (strcmp(t->children[i]->contents, ")") == 0){
+ if (strcmp(t->children[i]->contents, ")") == 0) {
continue;
}
- if (strcmp(t->children[i]->contents, "}") == 0){
+ if (strcmp(t->children[i]->contents, "}") == 0) {
continue;
}
- if (strcmp(t->children[i]->contents, "{") == 0){
+ if (strcmp(t->children[i]->contents, "{") == 0) {
continue;
}
- if (strcmp(t->children[i]->tag, "regex") == 0){
+ if (strcmp(t->children[i]->tag, "regex") == 0) {
continue;
}
x = cval_add(x, cval_read(t->children[i]));
@@ -551,40 +565,40 @@ cval* cval_read(mpc_ast_t* t) {
}
-void cval_print_str(cval* v) {
- char* escaped = malloc(strlen(v->str)+1);
+void cval_print_str(cval *v) {
+ char *escaped = malloc(strlen(v->str) + 1);
strcpy(escaped, v->str);
escaped = mpcf_escape(escaped);
printf("\"%s\"", escaped);
free(escaped);
}
-void cval_print_ht_str(cval* v, char* key) {
- char* escaped = malloc(strlen(v->str)+1);
+void cval_print_ht_str(cval *v, char *key) {
+ char *escaped = malloc(strlen(v->str) + 1);
strcpy(escaped, v->str);
escaped = mpcf_escape(escaped);
printf("%s : \"%s\"", key, escaped);
free(escaped);
}
-void cval_expr_print(cval* value, char open, char close) {
+void cval_expr_print(cval *value, char open, char close) {
putchar(open);
for (int i = 0; i < value->count; i++) {
cval_print(value->cell[i]);
- if (i != (value->count-1)) {
+ if (i != (value->count - 1)) {
putchar(' ');
}
}
putchar(close);
}
-void cval_expr_ht_print(cval* value, char open, char close, char* key) {
+void cval_expr_ht_print(cval *value, char open, char close, char *key) {
fputs(key, stdout);
fputs(" : ", stdout);
putchar(open);
for (int i = 0; i < value->count; i++) {
cval_print(value->cell[i]);
- if (i != (value->count-1)) {
+ if (i != (value->count - 1)) {
putchar(' ');
}
}
@@ -592,13 +606,14 @@ void cval_expr_ht_print(cval* value, char open, char close, char* key) {
}
-void cval_print(cval* value) {
+void cval_print(cval *value) {
switch (value->type) {
case CVAL_BOOLEAN:
if (value->boolean) {
printf("True");
} else {
- printf("False");}
+ printf("False");
+ }
break;
case CVAL_NUMBER:
@@ -642,7 +657,8 @@ void cval_print(cval* value) {
break;
}
}
-void cval_print_line(cval* value) {
+
+void cval_print_line(cval *value) {
cval_print(value);
putchar('\n');
}
From 5ab0794bd62616bf9aa2b0d1d3496a543eab2f4d Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:33:39 -0400
Subject: [PATCH 19/45] Format main.c
---
src/main.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main.c b/src/main.c
index 0738f6f..0068abc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -471,7 +471,7 @@ cval *builtin_ne(cenv *e, cval *a) {
cval *builtin_if(cenv *e, cval *a) {
CASSERT_NUM("if", a, 3)
- CASSERT_TYPE("if", a, 1,CVAL_Q_EXPRESSION)
+ CASSERT_TYPE("if", a, 1, CVAL_Q_EXPRESSION)
CASSERT_TYPE("if", a, 2, CVAL_Q_EXPRESSION)
if (a->cell[0]->type != CVAL_NUMBER) {
@@ -876,7 +876,7 @@ cval *builtin_input(cenv *e, cval *a) {
return cval_string(input);
}
-cval *builtin_exit(cenv* e, cval *a) {
+cval *builtin_exit(cenv *e, cval *a) {
CASSERT_TYPE("exit", a, 0, CVAL_NUMBER);
int exit_code = a->cell[0]->num;
@@ -887,7 +887,7 @@ cval *builtin_exit(cenv* e, cval *a) {
exit(exit_code);
}
-cval *builtin_mkdir(cenv* e, cval *a) {
+cval *builtin_mkdir(cenv *e, cval *a) {
CASSERT_NUM("mkdir", a, 1);
CASSERT_TYPE("mkdir", a, 0, CVAL_STRING);
char *path = a->cell[0]->str;
@@ -909,7 +909,7 @@ cval *builtin_mkdir(cenv* e, cval *a) {
}
}
-cval *builtin_chkdir(cenv* e,cval* a) {
+cval *builtin_chkdir(cenv *e, cval *a) {
CASSERT_NUM("chkdir", a, 1);
CASSERT_TYPE("chkdir", a, 0, CVAL_STRING);
struct stat st = {0};
From b9bd4f0dc8561029214b4a0de50f22a25b9cd1c3 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Wed, 2 Sep 2020 21:37:16 -0400
Subject: [PATCH 20/45] clean up chkdir
---
src/main.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/main.c b/src/main.c
index 0068abc..b1b77c0 100644
--- a/src/main.c
+++ b/src/main.c
@@ -915,14 +915,16 @@ cval *builtin_chkdir(cenv *e, cval *a) {
struct stat st = {0};
char *path = a->cell[0]->str;
+ cval* result;
if (stat(path, &st) == -1) {
- cval_delete(a);
- return cval_boolean(false);
+ result = cval_boolean(false);
} else {
- cval_delete(a);
- return cval_boolean(true);
+ result = cval_boolean(true);
}
+
+ cval_delete(a);
+ return result;
}
void cenv_add_builtins(cenv *e) {
From bc52d05ffd357ea02bfd6f80bd0a7058050a409a Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Fri, 4 Sep 2020 07:06:32 -0400
Subject: [PATCH 21/45] added DOWN function to http to allow downloading of
files
---
src/main.c | 28 ++++++++++++++++++++++++++--
src/stdlib/Q.connery | 2 ++
src/stdlib/http.connery | 5 +++++
src/util.c | 8 +++++++-
src/util.h | 3 +++
5 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/src/main.c b/src/main.c
index b1b77c0..a054ac5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -819,10 +819,8 @@ cval *builtin_http(cenv *e, cval *a) {
struct curl_slist *chunk = NULL;
curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_response_writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Connery");
- curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
for (int i = 0; i < request_headers->count; i++) {
CASSERT_TYPE("http_request_headers", request_headers, i, CVAL_STRING);
@@ -834,8 +832,32 @@ cval *builtin_http(cenv *e, cval *a) {
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, a->cell[3]->str);
}
+ if (strstr(type, "DOWN")) {
+ CASSERT_TYPE("http", a, 3, CVAL_STRING);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_download_writer);
+ } else {
+ curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_response_writer);
+ }
+
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+ if (strstr(type, "DOWN")) {
+ bool success = false;
+ FILE *pagefile;
+ pagefile = fopen(a->cell[3]->str, "wb");
+
+ if (pagefile) {
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, pagefile);
+ curl_easy_perform(curl);
+ fclose(pagefile);
+ success = true;}
+
+ cval_delete(a);
+ curl_easy_cleanup(curl);
+
+ return cval_boolean(success);
+ }
res = curl_easy_perform(curl);
if (res == CURLE_OK) {
@@ -861,11 +883,13 @@ cval *builtin_http(cenv *e, cval *a) {
cval_add(response_list, headers_list);
cval_add(response_list, cval_string(strstr(s.body, "\r\n\r\n") + 4));
} else {
+ cval_delete(a);
cval_delete(response_list);
response_list = cval_error("unable to accesh url!");
}
free(s.body);
curl_easy_cleanup(curl);
+ cval_delete(a);
}
return response_list;
}
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 4b7e7e9..53ce93b 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -2,6 +2,8 @@
(def {__Q_location__} "http://q.connerylang.org")
(def {__Q_package_list_url_slug__} "/packages/packages_list.csv")
+(mkdir "Q")
+
(fun {__Q_get_packages__ refresh} {
if (or __Q_packages__ refresh)
{def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__)))))}
diff --git a/src/stdlib/http.connery b/src/stdlib/http.connery
index d1a51ee..0bfca54 100644
--- a/src/stdlib/http.connery
+++ b/src/stdlib/http.connery
@@ -1,5 +1,6 @@
(def {GET} "GET")
(def {POST} "POST")
+(def {DOWN} "DOWN")
(fun {http_status_code_text response} {
case
@@ -27,3 +28,7 @@
(fun {http_post url post_body} {
http POST url None post_body
})
+
+(fun {http_download url location} {
+ http DOWN url None location
+})
\ No newline at end of file
diff --git a/src/util.c b/src/util.c
index c60cc83..66d6960 100644
--- a/src/util.c
+++ b/src/util.c
@@ -30,6 +30,12 @@ size_t http_response_writer(void *ptr, size_t size, size_t nmemb, struct http_re
return size * nmemb;
}
+size_t http_download_writer(void *ptr, size_t size, size_t nmemb, void *stream)
+{
+ size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
+ return written;
+}
+
typedef char *multi_tok_t;
char *multi_tok(char *input, multi_tok_t *string, char *delimiter) {
@@ -153,4 +159,4 @@ int mkpath(const char *path, mode_t mode) {
#endif
return -1;
return 1;
-}
+}
\ No newline at end of file
diff --git a/src/util.h b/src/util.h
index 4f3202a..4dbee17 100644
--- a/src/util.h
+++ b/src/util.h
@@ -12,6 +12,7 @@ struct http_response {
};
void init_http_response(struct http_response *s);
size_t http_response_writer(void *ptr, size_t size, size_t nmemb, struct http_response *s);
+size_t http_download_writer(void *ptr, size_t size, size_t nmemb, void *stream);
//multitok
typedef char *multi_tok_t;
@@ -27,4 +28,6 @@ long get_factor(int init_digits);
//mkpath
int mkpath(const char *path, mode_t mode);
+
+
#endif //CONNERY_UTIL_H
From b65589a68dfb3647219fac5422f77b380b5a72c5 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 5 Sep 2020 09:03:59 -0400
Subject: [PATCH 22/45] working on package manager
---
src/stdlib/Q.connery | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 53ce93b..65a1daa 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -1,14 +1,9 @@
-(def {__Q_packages__} False)
+(def {__Q_package_location__} "Q")
(def {__Q_location__} "http://q.connerylang.org")
(def {__Q_package_list_url_slug__} "/packages/packages_list.csv")
-(mkdir "Q")
-
-(fun {__Q_get_packages__ refresh} {
- if (or __Q_packages__ refresh)
- {def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__)))))}
- {False}
-})
+(mkdir __Q_package_location__)
+(def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__))))))
(fun {__Q_package_scan__ packages package_name} {
if (>= (length packages) 1)
@@ -19,5 +14,5 @@
})
(fun {Q package_name} {
- print "OK"
+ (__Q_package_scan__ __Q_packages__ package_name)
})
\ No newline at end of file
From adc9a0b22e41f4feb6b3ece6576625872180c1b9 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 5 Sep 2020 09:24:36 -0400
Subject: [PATCH 23/45] Added Null type
---
src/cval.c | 16 ++++++++++++++++
src/cval.h | 4 +++-
src/stdlib/Q.connery | 3 ++-
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 9dd0eda..732d7a2 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -50,6 +50,8 @@ char *ctype_name(int t) {
return "Float";
case CVAL_BOOLEAN:
return "Boolean";
+ case CVAL_NULL:
+ return "Null";
default:
return "Unknown Type";
}
@@ -129,6 +131,13 @@ cval *cval_boolean(bool b) {
return value;
}
+cval *cval_null() {
+ cval *value = malloc(sizeof(cval));
+ value->type = CVAL_NULL;
+ value->count = 0;
+ value->cell = NULL;
+ return value;
+}
cenv *cenv_new(void) {
cenv *e = malloc(sizeof(cenv));
@@ -267,6 +276,7 @@ cval *cval_copy(cval *v) {
case CVAL_BOOLEAN:
x->boolean = v->boolean;
break;
+
}
return x;
@@ -504,6 +514,8 @@ cval *cval_read_symbol(char *symbol) {
return cval_boolean(true);
} else if (strcmp(symbol, "False") == 0) {
return cval_boolean(false);
+ } else if (strcmp(symbol, "Null") == 0) {
+ return cval_null();
} else {
return cval_symbol(symbol);
}
@@ -616,6 +628,10 @@ void cval_print(cval *value) {
}
break;
+ case CVAL_NULL:
+ printf("NULL");
+ break;
+
case CVAL_NUMBER:
printf("%li", value->num);
break;
diff --git a/src/cval.h b/src/cval.h
index 7b315b3..942530d 100644
--- a/src/cval.h
+++ b/src/cval.h
@@ -13,7 +13,7 @@ typedef cval *(*cbuiltin)(cenv *, cval *);
enum {
CVAL_NUMBER, CVAL_ERROR, CVAL_SYMBOL, CVAL_FUNCTION,
CVAL_S_EXPRESSION, CVAL_Q_EXPRESSION, CVAL_STRING, CVAL_FLOAT,
- CVAL_BOOLEAN
+ CVAL_BOOLEAN, CVAL_NULL
};
struct cval {
@@ -56,6 +56,8 @@ cval *cval_symbol(char *s);
cval *cval_boolean(bool b);
+cval *cval_null();
+
cval *cval_s_expression(void);
cval *cval_q_expression(void);
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 65a1daa..52da683 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -14,5 +14,6 @@
})
(fun {Q package_name} {
- (__Q_package_scan__ __Q_packages__ package_name)
+ (= {__package_result__} (__Q_package_scan__ __Q_packages__ package_name))
+ (print __package_result__)
})
\ No newline at end of file
From 0e440a987cab6f8690281adfd1cf51a10b8fc01f Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 5 Sep 2020 09:29:29 -0400
Subject: [PATCH 24/45] Allow functions to return Null
---
src/cval.c | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 732d7a2..df07e56 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -380,11 +380,11 @@ cval *cval_evaluate_s_expression(cenv *env, cval *value) {
cval *f = cval_pop(value, 0);
if (f->type != CVAL_FUNCTION) {
- cval *err = cval_error("S-Expression starts with incorrect type. Got %s, Expected %s", ctype_name(f->type),
- ctype_name(CVAL_FUNCTION));
+// cval *err = cval_error("S-Expression starts with incorrect type. Got %s, Expected %s", ctype_name(f->type),
+// ctype_name(CVAL_FUNCTION));
cval_delete(f);
cval_delete(value);
- return err;
+ return cval_null();
}
cval *result = cval_call(env, f, value);
@@ -628,10 +628,6 @@ void cval_print(cval *value) {
}
break;
- case CVAL_NULL:
- printf("NULL");
- break;
-
case CVAL_NUMBER:
printf("%li", value->num);
break;
From 9e7d54bc132548205272cdb328bc8b04e024bb35 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 5 Sep 2020 09:33:02 -0400
Subject: [PATCH 25/45] Add support for null checks
---
src/main.c | 3 +++
src/stdlib/types.connery | 7 +++++++
2 files changed, 10 insertions(+)
diff --git a/src/main.c b/src/main.c
index a054ac5..ab1bd74 100644
--- a/src/main.c
+++ b/src/main.c
@@ -791,6 +791,9 @@ cval *builtin_type(cenv *e, cval *a) {
case CVAL_BOOLEAN:
return cval_number(7);
+ case CVAL_NULL:
+ return cval_number(8);
+
default:
return cval_error("Type not defined!");
}
diff --git a/src/stdlib/types.connery b/src/stdlib/types.connery
index 249d581..91d798d 100644
--- a/src/stdlib/types.connery
+++ b/src/stdlib/types.connery
@@ -8,6 +8,7 @@
{(== i 5) "Symbol"}
{(== i 6) "Float"}
{(== i 7) "Boolean"}
+ {(== i 8) "Null"}
{(Otherwise) "Unknown"}
})
@@ -59,6 +60,12 @@
{False}
})
+(fun {is_null i} {
+ if (== 8 (type i))
+ {True}
+ {False}
+})
+
(fun {type_string i} {
type_num (type i)
})
\ No newline at end of file
From edca53a33bb9b5bac92cae77b54361b42acc06dd Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 5 Sep 2020 09:41:07 -0400
Subject: [PATCH 26/45] Working on package manager
---
src/stdlib/Q.connery | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
index 52da683..0f1d4a4 100644
--- a/src/stdlib/Q.connery
+++ b/src/stdlib/Q.connery
@@ -1,19 +1,26 @@
(def {__Q_package_location__} "Q")
(def {__Q_location__} "http://q.connerylang.org")
(def {__Q_package_list_url_slug__} "/packages/packages_list.csv")
+(def {__Q_packages__} Null)
(mkdir __Q_package_location__)
-(def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__))))))
(fun {__Q_package_scan__ packages package_name} {
if (>= (length packages) 1)
{if (== (first (first (head packages))) package_name)
{first (head packages)}
{__Q_package_scan__ (tail packages) package_name}}
- {False}
+ {Null}
})
(fun {Q package_name} {
+ (if (is_null __Q_packages__)
+ {def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__)))))}
+ {})
+
(= {__package_result__} (__Q_package_scan__ __Q_packages__ package_name))
- (print __package_result__)
+
+ (if (is_null __package_result__)
+ {error (join "Package " package_name " not found!")}
+ {print "False"})
})
\ No newline at end of file
From 13ce57db0272ca3758985b51ec3b2b5ec55e84e5 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sun, 6 Sep 2020 15:15:39 -0400
Subject: [PATCH 27/45] Modified download http mode so it creates the required
path.
---
src/cval.c | 3 ++-
src/main.c | 16 +++++++++++++++-
2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index df07e56..b4610dd 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -672,6 +672,7 @@ void cval_print(cval *value) {
void cval_print_line(cval *value) {
cval_print(value);
- putchar('\n');
+ if (value->type != CVAL_NULL) {
+ putchar('\n'); }
}
diff --git a/src/main.c b/src/main.c
index ab1bd74..68df50f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -847,8 +847,20 @@ cval *builtin_http(cenv *e, cval *a) {
if (strstr(type, "DOWN")) {
bool success = false;
+ struct stat st = {0};
+ char* full_path = malloc(strlen(a->cell[3]->str));
+ char* path = malloc(strlen(a->cell[3]->str));
+ memcpy(full_path, a->cell[3]->str, strlen(a->cell[3]->str)+1);
+
+ char* pos = strrchr(a->cell[3]->str, '/');
+ memcpy(path, a->cell[3]->str, pos-a->cell[3]->str);
+
+ if (stat(path, &st) == -1) {
+ mkpath(path, 0700);
+ }
+
FILE *pagefile;
- pagefile = fopen(a->cell[3]->str, "wb");
+ pagefile = fopen(full_path, "wb");
if (pagefile) {
curl_easy_setopt(curl, CURLOPT_WRITEDATA, pagefile);
@@ -858,6 +870,8 @@ cval *builtin_http(cenv *e, cval *a) {
cval_delete(a);
curl_easy_cleanup(curl);
+ free(full_path);
+ free(path);
return cval_boolean(success);
}
From ed58db43282a2e6a5c0534b87d1deef29d7deb33 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 20:46:09 -0500
Subject: [PATCH 28/45] add traceback system to better locate errors
---
src/cval.c | 13 ++++++-------
src/main.c | 19 ++++++++++++++++---
src/stdlib/errors.connery | 20 +++++++++++++++++++-
src/util.h | 4 ----
4 files changed, 41 insertions(+), 15 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 24e6394..2468c59 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -347,11 +347,10 @@ cval* cval_evaluate_s_expression(cenv* env, cval* value) {
cval* f = cval_pop(value, 0);
if (f->type != CVAL_FUNCTION) {
- cval* err = cval_error("S-Expression starts with incorrect type. Got %s, Expected %s", ctype_name(f->type), ctype_name(CVAL_FUNCTION));
- cval_delete(f);
- cval_delete(value);
- return err;
- }
+ if (f->type == CVAL_S_EXPRESSION) {
+ return cval_evaluate_s_expression(env, f);
+ }
+ }
cval* result = cval_call(env, f, value);
cval_delete(f);
@@ -522,7 +521,7 @@ void cval_print_str(cval* v) {
char* escaped = malloc(strlen(v->str)+1);
strcpy(escaped, v->str);
escaped = mpcf_escape(escaped);
- printf("\"%s\"", escaped);
+ printf("%s", escaped);
free(escaped);
}
@@ -594,7 +593,7 @@ void cval_print(cval* value) {
break;
case CVAL_S_EXPRESSION:
- cval_expr_print(value, '(', ')');
+ cval_expr_print(value, ' ', ' ');
break;
case CVAL_Q_EXPRESSION:
diff --git a/src/main.c b/src/main.c
index 5259938..5d4b279 100644
--- a/src/main.c
+++ b/src/main.c
@@ -11,7 +11,7 @@
#define CONNERY_VERSION "0.0.1"
#define CONNERY_VER_INT 1
#define REPORT_STATEMENT_NUMBERS 1
-#define LOG_LEVEL 3
+#define LOG_LEVEL 4
#ifdef _WIN32
#include
@@ -586,7 +586,6 @@ cval *builtin_load(cenv *e, cval *a) {
CASSERT_NUM("load", a, 1)
CASSERT_TYPE("load", a, 0, CVAL_STRING)
-
mpc_result_t r;
if (mpc_parse_contents(a->cell[0]->str, Connery, &r)) {
cval *expr = cval_read(r.output);
@@ -600,11 +599,18 @@ cval *builtin_load(cenv *e, cval *a) {
#endif
while (expr->count) {
- cval *x = cval_evaluate(e, cval_pop(expr, 0));
+ cval *expression = cval_pop(expr, 0);
+
+ hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__"));
+ hash_table_set(e->ht, "__PREV_EXPRESSION__", hash_table_get(e->ht, "__EXPRESSION__"));
+ hash_table_set(e->ht, "__EXPRESSION__", expression);
+
+ cval *x = cval_evaluate(e, expression);
if (x->type == CVAL_ERROR) {
cval_print_line(x);
}
+
cval_delete(x);
#if REPORT_STATEMENT_NUMBERS
statement_number += 1;
@@ -1070,6 +1076,9 @@ int main(int argc, char **argv) {
Float, Number, Symbol, Sexpr, Qexpr, Expr, String, Comment, Connery);
cenv *e = cenv_new();
+ hash_table_set(e->ht, "__EXPRESSION__", cval_string("interpreter_start"));
+ hash_table_set(e->ht, "__PREV_EXPRESSION__", cval_string("interpreter_start"));
+
cenv_add_builtins(e);
load_standard_lib(e);
@@ -1101,6 +1110,10 @@ int main(int argc, char **argv) {
char *input = readline("connery> ");
add_history(input);
+ hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__"));
+ hash_table_set(e->ht, "__PREV_EXPRESSION__", hash_table_get(e->ht, "__EXPRESSION__"));
+ hash_table_set(e->ht, "__EXPRESSION__", cval_string(input));
+
mpc_result_t result;
if (mpc_parse("", input, Connery, &result)) {
cval *output = cval_evaluate(e, cval_read(result.output));
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index 852856a..cf2c60d 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -17,7 +17,25 @@
{log_error (join (join "during file: " __SOURCE_FILE__) (join " with caushe: " msg))}
{log_error (join "with caushe: " msg)})})})
-(if (== critical 1) {(log_fatal "critical error") (sys "HARD_EXIT")} {__FAULT__ msg})
+ (if (>= __LOG_LEVEL__ 4)
+ {
+ (print "")
+ (print "TRACE: ")
+
+ (if (>= __STATEMENT_NUMBER__ 3) {
+ (print __PREV_PREV_EXPRESSION__)
+ }{print "***"})
+
+ (if (>= __STATEMENT_NUMBER__ 2) {
+ (print __PREV_EXPRESSION__)
+ }{print "**"})
+
+ (if (>= __STATEMENT_NUMBER__ 1) {
+ (print __EXPRESSION__)
+ }{print "*"}) }
+ {})
+
+(if (== critical 1) {(log_fatal "critical error") (sys "HARD_EXIT")} {})
})
(fun {ERROR msg} {
diff --git a/src/util.h b/src/util.h
index 1a2cffa..e8f1d65 100644
--- a/src/util.h
+++ b/src/util.h
@@ -1,7 +1,3 @@
-//
-// Created by dev on 8/15/20.
-//
-
#ifndef CONNERY_UTIL_H
#define CONNERY_UTIL_H
From 2609776a449af602741b476a041fcf8d95c306d7 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 21:15:47 -0500
Subject: [PATCH 29/45] add traceback system to better locate errors
---
src/stdlib/errors.connery | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index cf2c60d..4b25558 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -19,7 +19,6 @@
(if (>= __LOG_LEVEL__ 4)
{
- (print "")
(print "TRACE: ")
(if (>= __STATEMENT_NUMBER__ 3) {
From 4e01f8c7c505eccf1138d18d5154cd644b78990c Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 21:29:22 -0500
Subject: [PATCH 30/45] add Makefile for easier builds
---
Makefile | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 298 insertions(+)
create mode 100644 Makefile
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c2e0e22
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,298 @@
+# CMAKE generated file: DO NOT EDIT!
+# Generated by "Unix Makefiles" Generator, CMake Version 3.13
+
+# Default target executed when no arguments are given to make.
+default_target: all
+
+.PHONY : default_target
+
+# Allow only one "make -f Makefile2" at a time, but pass parallelism.
+.NOTPARALLEL:
+
+
+#=============================================================================
+# Special targets provided by cmake.
+
+# Disable implicit rules so canonical targets will work.
+.SUFFIXES:
+
+
+# Remove some rules from gmake that .SUFFIXES does not remove.
+SUFFIXES =
+
+.SUFFIXES: .hpux_make_needs_suffix_list
+
+
+# Suppress display of executed commands.
+$(VERBOSE).SILENT:
+
+
+# A target that is always out of date.
+cmake_force:
+
+.PHONY : cmake_force
+
+#=============================================================================
+# Set environment variables for the build.
+
+# The shell in which to execute make rules.
+SHELL = /bin/sh
+
+# The CMake executable.
+CMAKE_COMMAND = /usr/bin/cmake
+
+# The command to remove a file.
+RM = /usr/bin/cmake -E remove -f
+
+# Escaping for special characters.
+EQUALS = =
+
+# The top-level source directory on which CMake was run.
+CMAKE_SOURCE_DIR = /home/dev/Code/C/Connery/src
+
+# The top-level build directory on which CMake was run.
+CMAKE_BINARY_DIR = /home/dev/Code/C/Connery
+
+#=============================================================================
+# Targets provided globally by CMake.
+
+# Special rule for the target rebuild_cache
+rebuild_cache:
+ @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
+ /usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
+.PHONY : rebuild_cache
+
+# Special rule for the target rebuild_cache
+rebuild_cache/fast: rebuild_cache
+
+.PHONY : rebuild_cache/fast
+
+# Special rule for the target edit_cache
+edit_cache:
+ @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
+ /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
+.PHONY : edit_cache
+
+# Special rule for the target edit_cache
+edit_cache/fast: edit_cache
+
+.PHONY : edit_cache/fast
+
+# The main all target
+all: cmake_check_build_system
+ $(CMAKE_COMMAND) -E cmake_progress_start /home/dev/Code/C/Connery/CMakeFiles /home/dev/Code/C/Connery/CMakeFiles/progress.marks
+ $(MAKE) -f CMakeFiles/Makefile2 all
+ $(CMAKE_COMMAND) -E cmake_progress_start /home/dev/Code/C/Connery/CMakeFiles 0
+.PHONY : all
+
+# The main clean target
+clean:
+ $(MAKE) -f CMakeFiles/Makefile2 clean
+.PHONY : clean
+
+# The main clean target
+clean/fast: clean
+
+.PHONY : clean/fast
+
+# Prepare targets for installation.
+preinstall: all
+ $(MAKE) -f CMakeFiles/Makefile2 preinstall
+.PHONY : preinstall
+
+# Prepare targets for installation.
+preinstall/fast:
+ $(MAKE) -f CMakeFiles/Makefile2 preinstall
+.PHONY : preinstall/fast
+
+# clear depends
+depend:
+ $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
+.PHONY : depend
+
+#=============================================================================
+# Target rules for targets named Connery
+
+# Build rule for target.
+Connery: cmake_check_build_system
+ $(MAKE) -f CMakeFiles/Makefile2 Connery
+.PHONY : Connery
+
+# fast build rule for target.
+Connery/fast:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/build
+.PHONY : Connery/fast
+
+cval.o: cval.c.o
+
+.PHONY : cval.o
+
+# target to build an object file
+cval.c.o:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.o
+.PHONY : cval.c.o
+
+cval.i: cval.c.i
+
+.PHONY : cval.i
+
+# target to preprocess a source file
+cval.c.i:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.i
+.PHONY : cval.c.i
+
+cval.s: cval.c.s
+
+.PHONY : cval.s
+
+# target to generate assembly for a file
+cval.c.s:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.s
+.PHONY : cval.c.s
+
+hashtable.o: hashtable.c.o
+
+.PHONY : hashtable.o
+
+# target to build an object file
+hashtable.c.o:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.o
+.PHONY : hashtable.c.o
+
+hashtable.i: hashtable.c.i
+
+.PHONY : hashtable.i
+
+# target to preprocess a source file
+hashtable.c.i:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.i
+.PHONY : hashtable.c.i
+
+hashtable.s: hashtable.c.s
+
+.PHONY : hashtable.s
+
+# target to generate assembly for a file
+hashtable.c.s:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.s
+.PHONY : hashtable.c.s
+
+main.o: main.c.o
+
+.PHONY : main.o
+
+# target to build an object file
+main.c.o:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.o
+.PHONY : main.c.o
+
+main.i: main.c.i
+
+.PHONY : main.i
+
+# target to preprocess a source file
+main.c.i:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.i
+.PHONY : main.c.i
+
+main.s: main.c.s
+
+.PHONY : main.s
+
+# target to generate assembly for a file
+main.c.s:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.s
+.PHONY : main.c.s
+
+mpc.o: mpc.c.o
+
+.PHONY : mpc.o
+
+# target to build an object file
+mpc.c.o:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.o
+.PHONY : mpc.c.o
+
+mpc.i: mpc.c.i
+
+.PHONY : mpc.i
+
+# target to preprocess a source file
+mpc.c.i:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.i
+.PHONY : mpc.c.i
+
+mpc.s: mpc.c.s
+
+.PHONY : mpc.s
+
+# target to generate assembly for a file
+mpc.c.s:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.s
+.PHONY : mpc.c.s
+
+util.o: util.c.o
+
+.PHONY : util.o
+
+# target to build an object file
+util.c.o:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.o
+.PHONY : util.c.o
+
+util.i: util.c.i
+
+.PHONY : util.i
+
+# target to preprocess a source file
+util.c.i:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.i
+.PHONY : util.c.i
+
+util.s: util.c.s
+
+.PHONY : util.s
+
+# target to generate assembly for a file
+util.c.s:
+ $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.s
+.PHONY : util.c.s
+
+# Help Target
+help:
+ @echo "The following are some of the valid targets for this Makefile:"
+ @echo "... all (the default if no target is provided)"
+ @echo "... clean"
+ @echo "... depend"
+ @echo "... rebuild_cache"
+ @echo "... Connery"
+ @echo "... edit_cache"
+ @echo "... cval.o"
+ @echo "... cval.i"
+ @echo "... cval.s"
+ @echo "... hashtable.o"
+ @echo "... hashtable.i"
+ @echo "... hashtable.s"
+ @echo "... main.o"
+ @echo "... main.i"
+ @echo "... main.s"
+ @echo "... mpc.o"
+ @echo "... mpc.i"
+ @echo "... mpc.s"
+ @echo "... util.o"
+ @echo "... util.i"
+ @echo "... util.s"
+.PHONY : help
+
+
+
+#=============================================================================
+# Special targets to cleanup operation of make.
+
+# Special rule to run CMake to check the build system integrity.
+# No rule that depends on this can have commands that come from listfiles
+# because they might be regenerated.
+cmake_check_build_system:
+ $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
+.PHONY : cmake_check_build_system
+
From 2696844e6985b623bf5c6c1ea5ffe23022a2f163 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 22:34:54 -0500
Subject: [PATCH 31/45] add Makefile for easier builds
---
.run/Connery [test.connery].run.xml | 7 +
.run/Connery.run.xml | 7 +
.run/docker.build.run.xml | 8 +
.run/docker.clean.run.xml | 8 +
.run/docker.run.run.xml | 8 +
.run/local.build.run.xml | 8 +
.run/local.clean.run.xml | 8 +
.run/local.run.run.xml | 8 +
Buildfile | 30 +++
Dockerfile | 14 +-
Makefile | 298 ----------------------------
11 files changed, 99 insertions(+), 305 deletions(-)
create mode 100644 .run/Connery [test.connery].run.xml
create mode 100644 .run/Connery.run.xml
create mode 100644 .run/docker.build.run.xml
create mode 100644 .run/docker.clean.run.xml
create mode 100644 .run/docker.run.run.xml
create mode 100644 .run/local.build.run.xml
create mode 100644 .run/local.clean.run.xml
create mode 100644 .run/local.run.run.xml
create mode 100644 Buildfile
delete mode 100644 Makefile
diff --git a/.run/Connery [test.connery].run.xml b/.run/Connery [test.connery].run.xml
new file mode 100644
index 0000000..9004d32
--- /dev/null
+++ b/.run/Connery [test.connery].run.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Connery.run.xml b/.run/Connery.run.xml
new file mode 100644
index 0000000..a093685
--- /dev/null
+++ b/.run/Connery.run.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/docker.build.run.xml b/.run/docker.build.run.xml
new file mode 100644
index 0000000..d61a9b7
--- /dev/null
+++ b/.run/docker.build.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/docker.clean.run.xml b/.run/docker.clean.run.xml
new file mode 100644
index 0000000..ff91824
--- /dev/null
+++ b/.run/docker.clean.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/docker.run.run.xml b/.run/docker.run.run.xml
new file mode 100644
index 0000000..167a31d
--- /dev/null
+++ b/.run/docker.run.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/local.build.run.xml b/.run/local.build.run.xml
new file mode 100644
index 0000000..1491191
--- /dev/null
+++ b/.run/local.build.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/local.clean.run.xml b/.run/local.clean.run.xml
new file mode 100644
index 0000000..a2920cd
--- /dev/null
+++ b/.run/local.clean.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/local.run.run.xml b/.run/local.run.run.xml
new file mode 100644
index 0000000..d9e6478
--- /dev/null
+++ b/.run/local.run.run.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Buildfile b/Buildfile
new file mode 100644
index 0000000..1bbdd63
--- /dev/null
+++ b/Buildfile
@@ -0,0 +1,30 @@
+local.install:
+ sudo apt-get update || true
+ sudo apt-get -y install build-essential || true
+ sudo apt-get -y install cmake || true
+ sudo apt-get -y install libcurl4-openssl-dev || true
+ sudo apt-get -y install libedit-dev || true
+
+local.build:
+ cmake src/. || true
+ make Connery
+
+local.clean:
+ make clean || true
+ rm cmake_install.cmake || true
+ rm CMakeCache.txt || true
+ rm -r CMakeFiles || true
+ rm -r stdlib || true
+ rm Makefile || true
+
+local.run:
+ ./Connery
+
+docker.build:
+ docker build --tag connerylang .
+
+docker.clean:
+ docker rmi connerylang
+
+docker.run:
+ docker run -it connerylang
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index a3cbb8b..dadb1ff 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,10 @@
FROM debian:buster
RUN apt-get update
-RUN apt-get -y install build-essential
-RUN apt-get -y install cmake
-RUN apt-get -y install libcurl4-openssl-dev
-RUN apt-get -y install libedit-dev
+RUN apt-get -y install make
+RUN apt-get -y install sudo
WORKDIR /Connery
-COPY src/. .
-RUN cmake .
-ENTRYPOINT "./cmake-build-debug/Connery" && /bin/bash
\ No newline at end of file
+COPY . .
+RUN make -f Buildfile local.install
+RUN cmake src/.
+RUN make Connery
+ENTRYPOINT "./Connery" && /bin/bash
\ No newline at end of file
diff --git a/Makefile b/Makefile
deleted file mode 100644
index c2e0e22..0000000
--- a/Makefile
+++ /dev/null
@@ -1,298 +0,0 @@
-# CMAKE generated file: DO NOT EDIT!
-# Generated by "Unix Makefiles" Generator, CMake Version 3.13
-
-# Default target executed when no arguments are given to make.
-default_target: all
-
-.PHONY : default_target
-
-# Allow only one "make -f Makefile2" at a time, but pass parallelism.
-.NOTPARALLEL:
-
-
-#=============================================================================
-# Special targets provided by cmake.
-
-# Disable implicit rules so canonical targets will work.
-.SUFFIXES:
-
-
-# Remove some rules from gmake that .SUFFIXES does not remove.
-SUFFIXES =
-
-.SUFFIXES: .hpux_make_needs_suffix_list
-
-
-# Suppress display of executed commands.
-$(VERBOSE).SILENT:
-
-
-# A target that is always out of date.
-cmake_force:
-
-.PHONY : cmake_force
-
-#=============================================================================
-# Set environment variables for the build.
-
-# The shell in which to execute make rules.
-SHELL = /bin/sh
-
-# The CMake executable.
-CMAKE_COMMAND = /usr/bin/cmake
-
-# The command to remove a file.
-RM = /usr/bin/cmake -E remove -f
-
-# Escaping for special characters.
-EQUALS = =
-
-# The top-level source directory on which CMake was run.
-CMAKE_SOURCE_DIR = /home/dev/Code/C/Connery/src
-
-# The top-level build directory on which CMake was run.
-CMAKE_BINARY_DIR = /home/dev/Code/C/Connery
-
-#=============================================================================
-# Targets provided globally by CMake.
-
-# Special rule for the target rebuild_cache
-rebuild_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
- /usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
-.PHONY : rebuild_cache
-
-# Special rule for the target rebuild_cache
-rebuild_cache/fast: rebuild_cache
-
-.PHONY : rebuild_cache/fast
-
-# Special rule for the target edit_cache
-edit_cache:
- @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..."
- /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available.
-.PHONY : edit_cache
-
-# Special rule for the target edit_cache
-edit_cache/fast: edit_cache
-
-.PHONY : edit_cache/fast
-
-# The main all target
-all: cmake_check_build_system
- $(CMAKE_COMMAND) -E cmake_progress_start /home/dev/Code/C/Connery/CMakeFiles /home/dev/Code/C/Connery/CMakeFiles/progress.marks
- $(MAKE) -f CMakeFiles/Makefile2 all
- $(CMAKE_COMMAND) -E cmake_progress_start /home/dev/Code/C/Connery/CMakeFiles 0
-.PHONY : all
-
-# The main clean target
-clean:
- $(MAKE) -f CMakeFiles/Makefile2 clean
-.PHONY : clean
-
-# The main clean target
-clean/fast: clean
-
-.PHONY : clean/fast
-
-# Prepare targets for installation.
-preinstall: all
- $(MAKE) -f CMakeFiles/Makefile2 preinstall
-.PHONY : preinstall
-
-# Prepare targets for installation.
-preinstall/fast:
- $(MAKE) -f CMakeFiles/Makefile2 preinstall
-.PHONY : preinstall/fast
-
-# clear depends
-depend:
- $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
-.PHONY : depend
-
-#=============================================================================
-# Target rules for targets named Connery
-
-# Build rule for target.
-Connery: cmake_check_build_system
- $(MAKE) -f CMakeFiles/Makefile2 Connery
-.PHONY : Connery
-
-# fast build rule for target.
-Connery/fast:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/build
-.PHONY : Connery/fast
-
-cval.o: cval.c.o
-
-.PHONY : cval.o
-
-# target to build an object file
-cval.c.o:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.o
-.PHONY : cval.c.o
-
-cval.i: cval.c.i
-
-.PHONY : cval.i
-
-# target to preprocess a source file
-cval.c.i:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.i
-.PHONY : cval.c.i
-
-cval.s: cval.c.s
-
-.PHONY : cval.s
-
-# target to generate assembly for a file
-cval.c.s:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/cval.c.s
-.PHONY : cval.c.s
-
-hashtable.o: hashtable.c.o
-
-.PHONY : hashtable.o
-
-# target to build an object file
-hashtable.c.o:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.o
-.PHONY : hashtable.c.o
-
-hashtable.i: hashtable.c.i
-
-.PHONY : hashtable.i
-
-# target to preprocess a source file
-hashtable.c.i:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.i
-.PHONY : hashtable.c.i
-
-hashtable.s: hashtable.c.s
-
-.PHONY : hashtable.s
-
-# target to generate assembly for a file
-hashtable.c.s:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/hashtable.c.s
-.PHONY : hashtable.c.s
-
-main.o: main.c.o
-
-.PHONY : main.o
-
-# target to build an object file
-main.c.o:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.o
-.PHONY : main.c.o
-
-main.i: main.c.i
-
-.PHONY : main.i
-
-# target to preprocess a source file
-main.c.i:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.i
-.PHONY : main.c.i
-
-main.s: main.c.s
-
-.PHONY : main.s
-
-# target to generate assembly for a file
-main.c.s:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/main.c.s
-.PHONY : main.c.s
-
-mpc.o: mpc.c.o
-
-.PHONY : mpc.o
-
-# target to build an object file
-mpc.c.o:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.o
-.PHONY : mpc.c.o
-
-mpc.i: mpc.c.i
-
-.PHONY : mpc.i
-
-# target to preprocess a source file
-mpc.c.i:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.i
-.PHONY : mpc.c.i
-
-mpc.s: mpc.c.s
-
-.PHONY : mpc.s
-
-# target to generate assembly for a file
-mpc.c.s:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/mpc.c.s
-.PHONY : mpc.c.s
-
-util.o: util.c.o
-
-.PHONY : util.o
-
-# target to build an object file
-util.c.o:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.o
-.PHONY : util.c.o
-
-util.i: util.c.i
-
-.PHONY : util.i
-
-# target to preprocess a source file
-util.c.i:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.i
-.PHONY : util.c.i
-
-util.s: util.c.s
-
-.PHONY : util.s
-
-# target to generate assembly for a file
-util.c.s:
- $(MAKE) -f CMakeFiles/Connery.dir/build.make CMakeFiles/Connery.dir/util.c.s
-.PHONY : util.c.s
-
-# Help Target
-help:
- @echo "The following are some of the valid targets for this Makefile:"
- @echo "... all (the default if no target is provided)"
- @echo "... clean"
- @echo "... depend"
- @echo "... rebuild_cache"
- @echo "... Connery"
- @echo "... edit_cache"
- @echo "... cval.o"
- @echo "... cval.i"
- @echo "... cval.s"
- @echo "... hashtable.o"
- @echo "... hashtable.i"
- @echo "... hashtable.s"
- @echo "... main.o"
- @echo "... main.i"
- @echo "... main.s"
- @echo "... mpc.o"
- @echo "... mpc.i"
- @echo "... mpc.s"
- @echo "... util.o"
- @echo "... util.i"
- @echo "... util.s"
-.PHONY : help
-
-
-
-#=============================================================================
-# Special targets to cleanup operation of make.
-
-# Special rule to run CMake to check the build system integrity.
-# No rule that depends on this can have commands that come from listfiles
-# because they might be regenerated.
-cmake_check_build_system:
- $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
-.PHONY : cmake_check_build_system
-
From 760840abb12d502ea301035764c144e0a4b7be13 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 22:46:38 -0500
Subject: [PATCH 32/45] add Makefile for easier builds
---
.run/docker.build.run.xml | 8 --------
.run/docker.clean.run.xml | 8 --------
.run/docker.run.run.xml | 8 --------
.run/local.build.run.xml | 8 --------
.run/local.clean.run.xml | 8 --------
Buildfile | 13 ++++++-------
Dockerfile | 9 ++++-----
7 files changed, 10 insertions(+), 52 deletions(-)
delete mode 100644 .run/docker.build.run.xml
delete mode 100644 .run/docker.clean.run.xml
delete mode 100644 .run/docker.run.run.xml
delete mode 100644 .run/local.build.run.xml
delete mode 100644 .run/local.clean.run.xml
diff --git a/.run/docker.build.run.xml b/.run/docker.build.run.xml
deleted file mode 100644
index d61a9b7..0000000
--- a/.run/docker.build.run.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.run/docker.clean.run.xml b/.run/docker.clean.run.xml
deleted file mode 100644
index ff91824..0000000
--- a/.run/docker.clean.run.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.run/docker.run.run.xml b/.run/docker.run.run.xml
deleted file mode 100644
index 167a31d..0000000
--- a/.run/docker.run.run.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.run/local.build.run.xml b/.run/local.build.run.xml
deleted file mode 100644
index 1491191..0000000
--- a/.run/local.build.run.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.run/local.clean.run.xml b/.run/local.clean.run.xml
deleted file mode 100644
index a2920cd..0000000
--- a/.run/local.clean.run.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Buildfile b/Buildfile
index 1bbdd63..439134c 100644
--- a/Buildfile
+++ b/Buildfile
@@ -1,12 +1,11 @@
local.install:
- sudo apt-get update || true
- sudo apt-get -y install build-essential || true
- sudo apt-get -y install cmake || true
- sudo apt-get -y install libcurl4-openssl-dev || true
- sudo apt-get -y install libedit-dev || true
+ sudo apt-get -y install build-essential
+ sudo apt-get -y install cmake
+ sudo apt-get -y install libcurl4-openssl-dev
+ sudo apt-get -y install libedit-dev
local.build:
- cmake src/. || true
+ cmake src/.
make Connery
local.clean:
@@ -24,7 +23,7 @@ docker.build:
docker build --tag connerylang .
docker.clean:
- docker rmi connerylang
+ docker rmi connerylang --force
docker.run:
docker run -it connerylang
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index dadb1ff..cf956ab 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,9 @@
FROM debian:buster
+WORKDIR /Connery
+COPY . .
RUN apt-get update
RUN apt-get -y install make
RUN apt-get -y install sudo
-WORKDIR /Connery
-COPY . .
RUN make -f Buildfile local.install
-RUN cmake src/.
-RUN make Connery
-ENTRYPOINT "./Connery" && /bin/bash
\ No newline at end of file
+RUN make -f Buildfile local.build
+ENTRYPOINT make -f Buildfile local.run
\ No newline at end of file
From a7440869b1bde9f9707b6e2405d8340be7d83865 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 6 Mar 2021 22:49:51 -0500
Subject: [PATCH 33/45] add build files to .gitignore
---
.gitignore | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/.gitignore b/.gitignore
index 461a8c9..78ed071 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,9 @@
# Project exclude paths
/cmake-build-debug/
.idea
-/.idea/*
\ No newline at end of file
+/.idea/*
+cmake_install.cmake
+CMakeCache.txt
+Connery
+Makefile
+/CMakeFiles/
\ No newline at end of file
From 879b191ab09d03be89fdffd98737ac5a99e695e4 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 13 Mar 2021 01:53:17 -0500
Subject: [PATCH 34/45] added install script
---
Buildfile | 4 ++--
install.sh | 13 +++++++++++++
src/CMakeLists.txt | 2 +-
src/trace.c | 3 +++
src/trace.h | 21 +++++++++++++++++++++
5 files changed, 40 insertions(+), 3 deletions(-)
create mode 100755 install.sh
create mode 100644 src/trace.c
create mode 100644 src/trace.h
diff --git a/Buildfile b/Buildfile
index 439134c..02ff9ab 100644
--- a/Buildfile
+++ b/Buildfile
@@ -17,7 +17,7 @@ local.clean:
rm Makefile || true
local.run:
- ./Connery
+ ./Connery || cmake src/. && make Connery && ./Connery || sudo apt-get -y install build-essential; sudo apt-get -y install cmake; sudo apt-get -y install libcurl4-openssl-dev; sudo apt-get -y install libedit-dev; cmake src/. && make Connery && ./Connery || echo "There is nothing like a challenge to bring out the best in man."
docker.build:
docker build --tag connerylang .
@@ -26,4 +26,4 @@ docker.clean:
docker rmi connerylang --force
docker.run:
- docker run -it connerylang
\ No newline at end of file
+ docker run -it connerylang || docker build --tag connerylang . && docker run -it connerylang
\ No newline at end of file
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..4c9433c
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+export CONNERY_PATH=$(eval echo ~$user)"/Connery";
+
+
+(cd ../"$CONNERY_PATH" || exit ; git clone --single-branch --branch release https://github.com/willcipriano/Connery.git) || true ;
+(cd "$CONNERY_PATH" || exit ; make -f Buildfile local.install ; make -f Buildfile local.build && make -f Buildfile local.run)
+
+
+
+
+
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index dea220b..77fffbf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,7 +5,7 @@ set(CMAKE_C_STANDARD 99)
set(CURL_LIBRARY "-lcurl")
find_package(CURL REQUIRED)
-add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c)
+add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c trace.c trace.h)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(Connery PRIVATE /usr/lib/x86_64-linux-gnu/libedit.so ${CURL_LIBRARIES})
diff --git a/src/trace.c b/src/trace.c
new file mode 100644
index 0000000..9e95e44
--- /dev/null
+++ b/src/trace.c
@@ -0,0 +1,3 @@
+#include "cval.h"
+#include "trace.h"
+
diff --git a/src/trace.h b/src/trace.h
new file mode 100644
index 0000000..2f5a758
--- /dev/null
+++ b/src/trace.h
@@ -0,0 +1,21 @@
+#ifndef CONNERY_TRACE_H
+#define CONNERY_TRACE_H
+
+typedef struct cval cval;
+
+typedef struct trace_entry {
+ int position;
+ cval data;
+ struct traceback_entry* next;
+ struct traceback_entry* prev;
+} trace_entry;
+
+typedef struct trace {
+ cval source;
+ int count;
+ struct traceback_entry* first;
+ struct traceback_entry* current;
+} trace;
+
+#endif //CONNERY_TRACE_H
+
From ed3539c92d0eb639b43b2df3c0382d2d7e09b004 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 13 Mar 2021 01:56:03 -0500
Subject: [PATCH 35/45] added install script
---
install.sh | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/install.sh b/install.sh
index 4c9433c..a8945f2 100755
--- a/install.sh
+++ b/install.sh
@@ -2,8 +2,7 @@
export CONNERY_PATH=$(eval echo ~$user)"/Connery";
-
-(cd ../"$CONNERY_PATH" || exit ; git clone --single-branch --branch release https://github.com/willcipriano/Connery.git) || true ;
+(cd "$CONNERY_PATH" || exit ; cd ../ && git clone --single-branch --branch release https://github.com/willcipriano/Connery.git) || true ;
(cd "$CONNERY_PATH" || exit ; make -f Buildfile local.install ; make -f Buildfile local.build && make -f Buildfile local.run)
From ef731471bc139db9638eec9d5edb7cbb173ffc84 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 20 Mar 2021 21:53:08 -0400
Subject: [PATCH 36/45] added in boolean values
---
install.sh | 24 ++++++++++++++---
src/cval.c | 50 +++++++++++++++++++++++++++++++++++-
src/cval.h | 7 ++++-
src/main.c | 22 +++++++++++++---
src/stdlib/constants.connery | 2 --
src/trace.c | 6 +++++
6 files changed, 100 insertions(+), 11 deletions(-)
diff --git a/install.sh b/install.sh
index a8945f2..bb4fa3b 100755
--- a/install.sh
+++ b/install.sh
@@ -1,9 +1,27 @@
#!/bin/bash
-export CONNERY_PATH=$(eval echo ~$user)"/Connery";
+connery_install_path=$(eval echo ~$user);
+export CONNERY_INSTALL_PATH=$connery_install_path;
+export CONNERY_PATH=$connery_install_path"/Connery"
-(cd "$CONNERY_PATH" || exit ; cd ../ && git clone --single-branch --branch release https://github.com/willcipriano/Connery.git) || true ;
-(cd "$CONNERY_PATH" || exit ; make -f Buildfile local.install ; make -f Buildfile local.build && make -f Buildfile local.run)
+pushd ./
+
+cd "$CONNERY_INSTALL_PATH" || exit &&
+git clone --single-branch --branch feature/traceback_system https://github.com/willcipriano/Connery.git
+
+
+cd "$CONNERY_PATH" || exit &&
+make -f Buildfile local.install ; make -f Buildfile local.build
+
+rm Buildfile || true ;
+rm CMakeCache.txt || true ;
+rm -rf CMakeFiles || true ;
+rm cmake_install.cmake || true ;
+rm Dockerfile || true ;
+rm -rf Makefile || true ;
+rm -rf src || true ;
+
+export PATH=$PATH:$CONNERY_PATH
diff --git a/src/cval.c b/src/cval.c
index 2468c59..f2c86d2 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -3,6 +3,7 @@
#include
#include
#include
+#include
#define ENV_HASH_TABLE_SIZE 10000
#define SYSTEM_LANG 1
@@ -39,6 +40,7 @@ char* ctype_name(int t) {
case CVAL_Q_EXPRESSION: return "Q-Expression";
case CVAL_STRING: return "String";
case CVAL_FLOAT: return "Float";
+ case CVAL_BOOLEAN: return "Boolean";
default: return "Unknown Type";
}
}
@@ -50,6 +52,15 @@ cval* cval_function(cbuiltin func) {
return v;
}
+cval *cval_boolean(bool b) {
+ cval *value = malloc(sizeof(cval));
+ value->type = CVAL_BOOLEAN;
+ value->boolean = b;
+ value->count = 0;
+ value->cell = NULL;
+ return value;
+}
+
cval* cval_number(long x) {
cval* value = malloc(sizeof(cval));
value->type = CVAL_NUMBER;
@@ -243,6 +254,11 @@ cval* cval_copy(cval* v) {
x->str = malloc(strlen(v->str) + 1);
strcpy(x->str, v->str);
break;
+
+
+ case CVAL_BOOLEAN:
+ x->boolean = v->boolean;
+ break;
}
return x;
@@ -440,6 +456,13 @@ cval* cval_join(cval* x, cval* y) {
return x;
}
+cval *cval_read_boolean(mpc_ast_t *t) {
+ if (strstr(t->contents, "True")) {
+ return cval_boolean(true);
+ }
+ return cval_boolean(false);
+}
+
cval* cval_read_num(mpc_ast_t* t) {
errno = 0;
long x = strtol(t->contents, NULL, 10);
@@ -464,8 +487,23 @@ cval* cval_read_string(mpc_ast_t* t) {
return str;
}
+cval *cval_read_symbol(char *symbol) {
+
+ if (strcmp(symbol, "True") == 0) {
+ return cval_boolean(true);
+ } else if (strcmp(symbol, "False") == 0) {
+ return cval_boolean(false);
+ } else {
+ return cval_symbol(symbol);
+ }
+}
+
cval* cval_read(mpc_ast_t* t) {
+ if (strstr(t->tag, "boolean")) {
+ return cval_read_boolean(t);
+ }
+
if (strstr(t->tag, "number")) {
return cval_read_num(t);
}
@@ -475,7 +513,7 @@ cval* cval_read(mpc_ast_t* t) {
}
if (strstr(t->tag, "symbol")) {
- return cval_symbol(t->contents);
+ return cval_read_symbol(t->contents);
}
cval* x = NULL;
@@ -560,6 +598,16 @@ void cval_expr_ht_print(cval* value, char open, char close, char* key) {
void cval_print(cval* value) {
switch (value->type) {
+
+ case CVAL_BOOLEAN:
+ if (value->boolean) {
+ printf("True");
+ } else {
+ printf("False");
+ }
+ break;
+
+
case CVAL_NUMBER:
printf("%li", value->num);
break;
diff --git a/src/cval.h b/src/cval.h
index fe2373b..6b4b50b 100644
--- a/src/cval.h
+++ b/src/cval.h
@@ -1,6 +1,7 @@
#ifndef CONNERY_CVAL_H
#define CONNERY_CVAL_H
+#include
#include "mpc.h"
#include "hashtable.h"
@@ -11,7 +12,8 @@ typedef cval *(*cbuiltin)(cenv *, cval *);
enum {
CVAL_NUMBER, CVAL_ERROR, CVAL_SYMBOL, CVAL_FUNCTION,
- CVAL_S_EXPRESSION, CVAL_Q_EXPRESSION, CVAL_STRING, CVAL_FLOAT
+ CVAL_S_EXPRESSION, CVAL_Q_EXPRESSION, CVAL_STRING, CVAL_FLOAT,
+ CVAL_BOOLEAN
};
struct cval {
@@ -22,6 +24,7 @@ struct cval {
char *err;
char *sym;
char *str;
+ bool boolean;
hash_table *ht;
cbuiltin builtin;
@@ -52,6 +55,8 @@ cval *cval_error(char *fmt, ...);
cval *cval_symbol(char *s);
+cval *cval_boolean(bool b);
+
cval *cval_s_expression(void);
cval *cval_q_expression(void);
diff --git a/src/main.c b/src/main.c
index 5d4b279..fd581dd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -535,18 +535,29 @@ cval *builtin_ne(cenv *e, cval *a) {
cval *builtin_if(cenv *e, cval *a) {
CASSERT_NUM("if", a, 3)
- CASSERT_TYPE("if", a, 0, CVAL_NUMBER)
CASSERT_TYPE("if", a, 1, CVAL_Q_EXPRESSION)
CASSERT_TYPE("if", a, 2, CVAL_Q_EXPRESSION)
+ if (a->cell[0]->type != CVAL_NUMBER) {
+ CASSERT_TYPE("if", a, 0, CVAL_BOOLEAN)
+ }
+
cval *x;
a->cell[1]->type = CVAL_S_EXPRESSION;
a->cell[2]->type = CVAL_S_EXPRESSION;
- if (a->cell[0]->num) {
- x = cval_evaluate(e, cval_pop(a, 1));
+ if (a->cell[0]->type == CVAL_BOOLEAN) {
+ if (a->cell[0]->boolean) {
+ x = cval_evaluate(e, cval_pop(a, 1));
+ } else {
+ x = cval_evaluate(e, cval_pop(a, 2));
+ }
} else {
- x = cval_evaluate(e, cval_pop(a, 2));
+ if (a->cell[0]->num) {
+ x = cval_evaluate(e, cval_pop(a, 1));
+ } else {
+ x = cval_evaluate(e, cval_pop(a, 2));
+ }
}
cval_delete(a);
@@ -862,6 +873,9 @@ cval *builtin_type(cenv *e, cval *a) {
case CVAL_SYMBOL:
return cval_number(5);
+ case CVAL_BOOLEAN:
+ return cval_number(6);
+
default:
return cval_error("Type not defined!");
}
diff --git a/src/stdlib/constants.connery b/src/stdlib/constants.connery
index b5dd6f3..a601f3d 100644
--- a/src/stdlib/constants.connery
+++ b/src/stdlib/constants.connery
@@ -1,8 +1,6 @@
; Constants
(def {None} {})
(def {Empty} "")
-(def {True} 1)
-(def {False} 0)
(def {Otherwise} True)
(def {std_lib_main_location} "stdlib/main.connery")
diff --git a/src/trace.c b/src/trace.c
index 9e95e44..0eee2e5 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -1,3 +1,9 @@
#include "cval.h"
#include "trace.h"
+trace_entry *trace_entry_create() {
+
+ trace_entry *te = malloc(sizeof(trace_entry) * 1);
+
+}
+
From c33d1edb69ab3923cb5f6c7321c0a01b898d63d5 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sun, 21 Mar 2021 00:17:00 -0400
Subject: [PATCH 37/45] added in boolean values
---
src/CMakeLists.txt | 2 +-
src/time.c | 5 +++++
src/time.h | 8 ++++++++
src/trace.c | 12 +++++++++++-
src/trace.h | 10 ++++++----
5 files changed, 31 insertions(+), 6 deletions(-)
create mode 100644 src/time.c
create mode 100644 src/time.h
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 77fffbf..de5ff46 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,7 +5,7 @@ set(CMAKE_C_STANDARD 99)
set(CURL_LIBRARY "-lcurl")
find_package(CURL REQUIRED)
-add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c trace.c trace.h)
+add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c trace.c trace.h time.c time.h)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(Connery PRIVATE /usr/lib/x86_64-linux-gnu/libedit.so ${CURL_LIBRARIES})
diff --git a/src/time.c b/src/time.c
new file mode 100644
index 0000000..075b145
--- /dev/null
+++ b/src/time.c
@@ -0,0 +1,5 @@
+#include "time.h"
+
+const char* current_time_string() {
+
+}
\ No newline at end of file
diff --git a/src/time.h b/src/time.h
new file mode 100644
index 0000000..68c39d5
--- /dev/null
+++ b/src/time.h
@@ -0,0 +1,8 @@
+#ifndef CONNERY_TIME_H
+#define CONNERY_TIME_H
+
+typedef struct cval cval;
+
+
+
+#endif //CONNERY_TIME_H
diff --git a/src/trace.c b/src/trace.c
index 0eee2e5..28ed487 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -1,9 +1,19 @@
#include "cval.h"
#include "trace.h"
-trace_entry *trace_entry_create() {
+trace_entry *start_trace() {
+ trace *tr = malloc(sizeof(trace) * 1);
trace_entry *te = malloc(sizeof(trace_entry) * 1);
+ tr->count=0;
+ tr->current=te;
+ tr->first=te;
+ tr->source=cval_string("initialization");
+
+
+ te->position=0;
+ te->data=cval_string("initialization of trace")
+
}
diff --git a/src/trace.h b/src/trace.h
index 2f5a758..737a42a 100644
--- a/src/trace.h
+++ b/src/trace.h
@@ -1,20 +1,22 @@
#ifndef CONNERY_TRACE_H
#define CONNERY_TRACE_H
+#include
+
typedef struct cval cval;
typedef struct trace_entry {
int position;
- cval data;
+ cval* data;
struct traceback_entry* next;
struct traceback_entry* prev;
} trace_entry;
typedef struct trace {
- cval source;
+ cval* source;
int count;
- struct traceback_entry* first;
- struct traceback_entry* current;
+ struct trace_entry* first;
+ struct trace_entry* current;
} trace;
#endif //CONNERY_TRACE_H
From a004436b6f0bfc16d1280538231c58dbba17b258 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 09:45:49 -0400
Subject: [PATCH 38/45] clean up traceback/error system
---
src/main.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++-------
src/trace.c | 42 ++++++++++++++++++++++++----
src/trace.h | 13 +++++----
3 files changed, 114 insertions(+), 20 deletions(-)
diff --git a/src/main.c b/src/main.c
index fd581dd..75a11fd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -6,6 +6,7 @@
#include "util.h"
#include "cval.h"
#include "hashtable.h"
+#include "trace.h"
#define SYSTEM_LANG 0
#define CONNERY_VERSION "0.0.1"
@@ -279,6 +280,24 @@ cval *builtin_head(cenv *e, cval *a) {
}
+cval *set_trace_data(cenv *e, trace *t) {
+ hash_table_set(e ->ht, "__STATEMENT_NUMBER__", cval_number(t->current->position));
+
+ if (t->current->position > 2) {
+ hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__")); }
+ else {
+ hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", cval_string(""));
+ }
+
+ if (t->current->position > 1) {
+ hash_table_set(e->ht, "__PREV_EXPRESSION__", t->current->prev->data); }
+ else {
+ hash_table_set(e->ht, "__PREV_EXPRESSION__", cval_string(""));
+ }
+
+ hash_table_set(e->ht, "__EXPRESSION__", t->current->data);
+}
+
cval *builtin_tail(cenv *e, cval *a) {
CASSERT_NUM("tail", a, 1)
@@ -593,6 +612,7 @@ cval *builtin_lambda(cenv *e, cval *a) {
return cval_lambda(formals, body);
}
+
cval *builtin_load(cenv *e, cval *a) {
CASSERT_NUM("load", a, 1)
CASSERT_TYPE("load", a, 0, CVAL_STRING)
@@ -612,10 +632,6 @@ cval *builtin_load(cenv *e, cval *a) {
while (expr->count) {
cval *expression = cval_pop(expr, 0);
- hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__"));
- hash_table_set(e->ht, "__PREV_EXPRESSION__", hash_table_get(e->ht, "__EXPRESSION__"));
- hash_table_set(e->ht, "__EXPRESSION__", expression);
-
cval *x = cval_evaluate(e, expression);
if (x->type == CVAL_ERROR) {
@@ -645,6 +661,49 @@ cval *builtin_load(cenv *e, cval *a) {
}
}
+cval *builtin_traced_load(cenv *e, cval *a,trace* t ) {
+ CASSERT_NUM("load", a, 1)
+ CASSERT_TYPE("load", a, 0, CVAL_STRING)
+
+ mpc_result_t r;
+ if (mpc_parse_contents(a->cell[0]->str, Connery, &r)) {
+ cval *expr = cval_read(r.output);
+ mpc_ast_delete(r.output);
+
+ while (expr->count) {
+ cval *expression = cval_pop(expr, 0);
+ record_trace(t, expression);
+ set_trace_data(e, t);
+
+ cval *x = cval_evaluate(e, expression);
+
+ if (x->type == CVAL_ERROR) {
+ cval_print_line(x);
+ }
+
+ cval_delete(x);
+#if REPORT_STATEMENT_NUMBERS
+#endif
+
+ }
+
+ cval_delete(expr);
+ cval_delete(a);
+
+ return cval_s_expression();
+ } else {
+ char *err_msg = mpc_err_string(r.error);
+ mpc_err_delete(r.error);
+
+ cval *err = cval_error("Could not load library '%s'", err_msg);
+ free(err_msg);
+ cval_delete(a);
+ return err;
+ }
+
+
+}
+
cval *builtin_print(cenv *e, cval *a) {
for (int i = 0; i < a->count; i++) {
cval_print(a->cell[i]);
@@ -1010,6 +1069,7 @@ cval *builtin_sys(cenv *e, cval *a) {
}
+
void cenv_add_builtins(cenv *e) {
cenv_add_builtin(e, "\\", builtin_lambda);
cenv_add_builtin(e, "def", builtin_def);
@@ -1090,8 +1150,6 @@ int main(int argc, char **argv) {
Float, Number, Symbol, Sexpr, Qexpr, Expr, String, Comment, Connery);
cenv *e = cenv_new();
- hash_table_set(e->ht, "__EXPRESSION__", cval_string("interpreter_start"));
- hash_table_set(e->ht, "__PREV_EXPRESSION__", cval_string("interpreter_start"));
cenv_add_builtins(e);
load_standard_lib(e);
@@ -1120,13 +1178,13 @@ int main(int argc, char **argv) {
if (argc == 1) {
hash_table_set(e ->ht, "__SOURCE__", cval_string("INTERACTIVE"));
+ trace* trace = start_trace("interactive");
while (1) {
char *input = readline("connery> ");
add_history(input);
- hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__"));
- hash_table_set(e->ht, "__PREV_EXPRESSION__", hash_table_get(e->ht, "__EXPRESSION__"));
- hash_table_set(e->ht, "__EXPRESSION__", cval_string(input));
+ record_trace(trace, cval_string(input));
+ set_trace_data(e, trace);
mpc_result_t result;
if (mpc_parse("", input, Connery, &result)) {
@@ -1150,10 +1208,11 @@ int main(int argc, char **argv) {
if (argc >= 2) {
hash_table_set(e ->ht, "__SOURCE__", cval_string("FILE"));
+ trace* trace = start_trace("file");
for (int i = 1; i < argc; i++) {
cval *args = cval_add(cval_s_expression(), cval_string(argv[i]));
hash_table_set(e ->ht, "__SOURCE_FILE__", cval_string(argv[i]));
- cval *x = builtin_load(e, args);
+ cval *x = builtin_traced_load(e, args, trace);
if (x->type == CVAL_ERROR) {
cval_print_line(x);
diff --git a/src/trace.c b/src/trace.c
index 28ed487..6235ee7 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -1,19 +1,51 @@
#include "cval.h"
#include "trace.h"
-trace_entry *start_trace() {
+trace* start_trace(char* s) {
trace *tr = malloc(sizeof(trace) * 1);
trace_entry *te = malloc(sizeof(trace_entry) * 1);
- tr->count=0;
+ te->position=0;
+ te->data=cval_string("initialization of trace");
+
tr->current=te;
tr->first=te;
- tr->source=cval_string("initialization");
+ tr->source=cval_string(s);
+ return tr;
+}
- te->position=0;
- te->data=cval_string("initialization of trace")
+void record_trace(trace* t, cval* data) {
+ trace_entry *te = malloc(sizeof(trace_entry) * 1);
+
+ te->position=t->current->position + 1;
+ te->prev=t->current;
+ te->data=data;
+
+ t->current->next=te;
+ t->current=te;
+}
+
+void record_str_trace(trace* t, char* data) {
+ record_trace(t, cval_string(data));
+}
+
+cval* fetch_traceback_data(trace* t, int x) {
+ trace_entry* cur_te = t->current;
+ cval* traceback = cval_q_expression();
+ int y = 0;
+
+ if (x > t->current->position) {
+ x = t->current->position;
+ }
+
+ while (y <= x) {
+ cval_add(traceback, cur_te->data);
+ cur_te = t->current->prev;
+ y += 1;
+ }
+ return traceback;
}
diff --git a/src/trace.h b/src/trace.h
index 737a42a..48af14b 100644
--- a/src/trace.h
+++ b/src/trace.h
@@ -1,23 +1,26 @@
#ifndef CONNERY_TRACE_H
#define CONNERY_TRACE_H
-#include
-
+#include "cval.h"
typedef struct cval cval;
typedef struct trace_entry {
int position;
cval* data;
- struct traceback_entry* next;
- struct traceback_entry* prev;
+ struct trace_entry* next;
+ struct trace_entry* prev;
} trace_entry;
typedef struct trace {
cval* source;
- int count;
struct trace_entry* first;
struct trace_entry* current;
} trace;
+trace* start_trace(char* s);
+void record_trace(trace* t, cval* data);
+void record_str_trace(trace* t, char* data);
+cval* fetch_traceback_data(trace* t, int x);
+
#endif //CONNERY_TRACE_H
From e2561febd12c0f630e1d4c99f03edef6a9aab08f Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 10:50:07 -0400
Subject: [PATCH 39/45] improve error message output
---
src/cval.c | 1 +
src/main.c | 19 +------------------
src/mpc.c | 5 ++---
src/stdlib/errors.connery | 2 +-
src/util.c | 20 ++++++++++++++++++++
src/util.h | 1 +
6 files changed, 26 insertions(+), 22 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index f2c86d2..2761304 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -1,4 +1,5 @@
#include "cval.h"
+#include "util.h"
#include
#include
#include
diff --git a/src/main.c b/src/main.c
index 75a11fd..08c36e6 100644
--- a/src/main.c
+++ b/src/main.c
@@ -13,6 +13,7 @@
#define CONNERY_VER_INT 1
#define REPORT_STATEMENT_NUMBERS 1
#define LOG_LEVEL 4
+#define ENABLE_FULL_TRACE false
#ifdef _WIN32
#include
@@ -285,15 +286,9 @@ cval *set_trace_data(cenv *e, trace *t) {
if (t->current->position > 2) {
hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", hash_table_get(e->ht, "__PREV_EXPRESSION__")); }
- else {
- hash_table_set(e->ht, "__PREV_PREV_EXPRESSION__", cval_string(""));
- }
if (t->current->position > 1) {
hash_table_set(e->ht, "__PREV_EXPRESSION__", t->current->prev->data); }
- else {
- hash_table_set(e->ht, "__PREV_EXPRESSION__", cval_string(""));
- }
hash_table_set(e->ht, "__EXPRESSION__", t->current->data);
}
@@ -1169,13 +1164,6 @@ int main(int argc, char **argv) {
hash_table_set(e ->ht, "__LOG_LEVEL__", cval_number(LOG_LEVEL));
-#if REPORT_STATEMENT_NUMBERS==1
- int statement_number = 1;
- hash_table_set(e ->ht, "__STATEMENT_NUMBER__", cval_number(statement_number));
-#else
- hash_table_set(e ->ht, "__STATEMENT_NUMBER__", cval_number(-1));
-#endif
-
if (argc == 1) {
hash_table_set(e ->ht, "__SOURCE__", cval_string("INTERACTIVE"));
trace* trace = start_trace("interactive");
@@ -1192,11 +1180,6 @@ int main(int argc, char **argv) {
cval_print_line(output);
cval_delete(output);
-#if REPORT_STATEMENT_NUMBERS==1
- statement_number += 1;
- hash_table_set(e ->ht, "__STATEMENT_NUMBER__", cval_number(statement_number));
-#endif
-
mpc_ast_delete(result.output);
} else {
mpc_err_print(result.error);
diff --git a/src/mpc.c b/src/mpc.c
index fc6bea7..2eab5a1 100644
--- a/src/mpc.c
+++ b/src/mpc.c
@@ -2482,11 +2482,10 @@ mpc_val_t *mpcf_strtrim(mpc_val_t *x) {
static const char mpc_escape_input_c[] = {
'\a', '\b', '\f', '\n', '\r',
- '\t', '\v', '\\', '\'', '\"', '\0'};
+ '\t', '\v', '\0'};
static const char *mpc_escape_output_c[] = {
- "\\a", "\\b", "\\f", "\\n", "\\r", "\\t",
- "\\v", "\\\\", "\\'", "\\\"", "\\0", NULL};
+ "\\a", "\\b", "\\f", "\\n", "\\r", "\\t", NULL};
static const char mpc_escape_input_raw_re[] = { '/' };
static const char *mpc_escape_output_raw_re[] = { "\\/", NULL };
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index 4b25558..cc1ab33 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -37,7 +37,7 @@
(if (== critical 1) {(log_fatal "critical error") (sys "HARD_EXIT")} {})
})
-(fun {ERROR msg} {
+(fun {panic msg} {
if (is_str msg)
{__ERROR__ msg 1}
{__ERROR__ (string_convert msg) 1}
diff --git a/src/util.c b/src/util.c
index e0f4ca1..02b89b8 100644
--- a/src/util.c
+++ b/src/util.c
@@ -125,3 +125,23 @@ long get_factor(int init_digits) {
return -1;
}
}
+
+char *replace_str(char *str, char *orig, char *rep)
+{
+ static char buffer[4096];
+ char *p;
+ int i=0;
+
+ while(str[i]){
+ if (!(p=strstr(str+i,orig))) return str;
+ strncpy(buffer+strlen(buffer),str+i,(p-str)-i);
+ buffer[p-str] = '\0';
+ strcat(buffer,rep);
+ printf("STR:%s\n",buffer);
+ i=(p-str)+strlen(orig);
+ }
+
+ return buffer;
+}
+
+
diff --git a/src/util.h b/src/util.h
index e8f1d65..2a7bc4a 100644
--- a/src/util.h
+++ b/src/util.h
@@ -19,5 +19,6 @@ char *concatenateThree(const char *a, const char *b, const char *c);
long long_power(long x,long exponent);
int count_digits(long n);
long get_factor(int init_digits);
+char *replace_str(char *str, char *orig, char *rep);
#endif //CONNERY_UTIL_H
From dc8fc431aadee4c968cf29d6958d2ca195f8f2d1 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 11:28:05 -0400
Subject: [PATCH 40/45] Added trace object for more useful error messages
---
src/cval.c | 2 ++
src/main.c | 21 +++++----------------
src/trace.c | 2 +-
3 files changed, 8 insertions(+), 17 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 2761304..670895e 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -1,5 +1,6 @@
#include "cval.h"
#include "util.h"
+#include "trace.h"
#include
#include
#include
@@ -408,6 +409,7 @@ void cenv_add_builtin(cenv* e, char* name, cbuiltin func) {
cval_delete(v);
}
+
void cenv_def(cenv* e, cval* k, cval* v) {
while (e->par) {
e = e->par;
diff --git a/src/main.c b/src/main.c
index 08c36e6..95b7110 100644
--- a/src/main.c
+++ b/src/main.c
@@ -612,17 +612,13 @@ cval *builtin_load(cenv *e, cval *a) {
CASSERT_NUM("load", a, 1)
CASSERT_TYPE("load", a, 0, CVAL_STRING)
+ hash_table_set(e->ht, "__STATEMENT_NUMBER__", cval_number(-1));
+
mpc_result_t r;
if (mpc_parse_contents(a->cell[0]->str, Connery, &r)) {
cval *expr = cval_read(r.output);
mpc_ast_delete(r.output);
-# if REPORT_STATEMENT_NUMBERS
- int statement_number = 1;
- hash_table_set(e->ht, "__STATEMENT_NUMBER__", cval_number(statement_number));
-#else
- hash_table_set(e->ht, "__STATEMENT_NUMBER__", cval_number(-1));
-#endif
while (expr->count) {
cval *expression = cval_pop(expr, 0);
@@ -634,10 +630,6 @@ cval *builtin_load(cenv *e, cval *a) {
}
cval_delete(x);
-#if REPORT_STATEMENT_NUMBERS
- statement_number += 1;
- hash_table_set(e->ht, "__STATEMENT_NUMBER__", cval_number(statement_number));
-#endif
}
@@ -657,8 +649,8 @@ cval *builtin_load(cenv *e, cval *a) {
}
cval *builtin_traced_load(cenv *e, cval *a,trace* t ) {
- CASSERT_NUM("load", a, 1)
- CASSERT_TYPE("load", a, 0, CVAL_STRING)
+ CASSERT_NUM("traced_load", a, 1)
+ CASSERT_TYPE("traced_load", a, 0, CVAL_STRING)
mpc_result_t r;
if (mpc_parse_contents(a->cell[0]->str, Connery, &r)) {
@@ -677,9 +669,6 @@ cval *builtin_traced_load(cenv *e, cval *a,trace* t ) {
}
cval_delete(x);
-#if REPORT_STATEMENT_NUMBERS
-#endif
-
}
cval_delete(expr);
@@ -1191,7 +1180,7 @@ int main(int argc, char **argv) {
if (argc >= 2) {
hash_table_set(e ->ht, "__SOURCE__", cval_string("FILE"));
- trace* trace = start_trace("file");
+ trace* trace = start_trace("FILE");
for (int i = 1; i < argc; i++) {
cval *args = cval_add(cval_s_expression(), cval_string(argv[i]));
hash_table_set(e ->ht, "__SOURCE_FILE__", cval_string(argv[i]));
diff --git a/src/trace.c b/src/trace.c
index 6235ee7..2c20ca6 100644
--- a/src/trace.c
+++ b/src/trace.c
@@ -21,7 +21,7 @@ void record_trace(trace* t, cval* data) {
te->position=t->current->position + 1;
te->prev=t->current;
- te->data=data;
+ te->data=cval_copy(data);
t->current->next=te;
t->current=te;
From fc68fd516e8c238ef4ce59aca809f62328d5ca7c Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 12:39:01 -0400
Subject: [PATCH 41/45] Added trace object for more useful error messages
---
src/cval.c | 18 +++++++++++-------
src/cval.h | 4 ++--
src/main.c | 4 +++-
src/stdlib/errors.connery | 6 +++---
4 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/src/cval.c b/src/cval.c
index 670895e..4f28899 100644
--- a/src/cval.c
+++ b/src/cval.c
@@ -562,7 +562,7 @@ void cval_print_str(cval* v) {
char* escaped = malloc(strlen(v->str)+1);
strcpy(escaped, v->str);
escaped = mpcf_escape(escaped);
- printf("%s", escaped);
+ printf("%s", v->str);
free(escaped);
}
@@ -574,7 +574,8 @@ void cval_print_ht_str(cval* v, char* key) {
free(escaped);
}
-void cval_expr_print(cval* value, char open, char close) {
+bool cval_expr_print(cval* value, char open, char close) {
+ if (value->count >= 1) {
putchar(open);
for (int i = 0; i < value->count; i++) {
cval_print(value->cell[i]);
@@ -583,6 +584,8 @@ void cval_expr_print(cval* value, char open, char close) {
}
}
putchar(close);
+ return true;}
+ return false;
}
void cval_expr_ht_print(cval* value, char open, char close, char* key) {
@@ -599,7 +602,7 @@ void cval_expr_ht_print(cval* value, char open, char close, char* key) {
}
-void cval_print(cval* value) {
+bool cval_print(cval* value) {
switch (value->type) {
case CVAL_BOOLEAN:
@@ -644,8 +647,7 @@ void cval_print(cval* value) {
break;
case CVAL_S_EXPRESSION:
- cval_expr_print(value, ' ', ' ');
- break;
+ return cval_expr_print(value, '(', ')');
case CVAL_Q_EXPRESSION:
cval_expr_print(value, '{', '}');
@@ -655,9 +657,11 @@ void cval_print(cval* value) {
cval_print_str(value);
break;
}
+
+ return true;
}
void cval_print_line(cval* value) {
- cval_print(value);
- putchar('\n');
+ if (cval_print(value)) {
+ putchar('\n'); }
}
diff --git a/src/cval.h b/src/cval.h
index 6b4b50b..f81f66a 100644
--- a/src/cval.h
+++ b/src/cval.h
@@ -87,9 +87,9 @@ cval *cval_read(mpc_ast_t *t);
void cval_print_line(cval *value);
-void cval_expr_print(cval *value, char open, char close);
+bool cval_expr_print(cval *value, char open, char close);
-void cval_print(cval *value);
+bool cval_print(cval *value);
void cval_print_ht_str(cval *v, char *key);
diff --git a/src/main.c b/src/main.c
index 95b7110..156a08d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -612,7 +612,7 @@ cval *builtin_load(cenv *e, cval *a) {
CASSERT_NUM("load", a, 1)
CASSERT_TYPE("load", a, 0, CVAL_STRING)
- hash_table_set(e->ht, "__STATEMENT_NUMBER__", cval_number(-1));
+ trace* t = start_trace(a->cell[0]->str);
mpc_result_t r;
if (mpc_parse_contents(a->cell[0]->str, Connery, &r)) {
@@ -622,6 +622,8 @@ cval *builtin_load(cenv *e, cval *a) {
while (expr->count) {
cval *expression = cval_pop(expr, 0);
+ record_trace(t, expression);
+ set_trace_data(e, t);
cval *x = cval_evaluate(e, expression);
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index cc1ab33..ce20c1b 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -22,15 +22,15 @@
(print "TRACE: ")
(if (>= __STATEMENT_NUMBER__ 3) {
- (print __PREV_PREV_EXPRESSION__)
+ (print (join " " __PREV_PREV_EXPRESSION__))
}{print "***"})
(if (>= __STATEMENT_NUMBER__ 2) {
- (print __PREV_EXPRESSION__)
+ (print (join " " __PREV_EXPRESSION__))
}{print "**"})
(if (>= __STATEMENT_NUMBER__ 1) {
- (print __EXPRESSION__)
+ (print (join " " __EXPRESSION__))
}{print "*"}) }
{})
From 60844f753151f566591aa7e8b5e0962bba34e125 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 13:33:06 -0400
Subject: [PATCH 42/45] Added handler for errors so behavior can be patched on
the fly, added disable and enable function for errors
---
src/CMakeLists.txt | 2 +-
src/main.c | 1 -
src/stdlib/errors.connery | 30 +++++++++++++++++++++---------
src/time.c | 5 -----
src/time.h | 8 --------
src/util.c | 18 ------------------
6 files changed, 22 insertions(+), 42 deletions(-)
delete mode 100644 src/time.c
delete mode 100644 src/time.h
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index de5ff46..77fffbf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -5,7 +5,7 @@ set(CMAKE_C_STANDARD 99)
set(CURL_LIBRARY "-lcurl")
find_package(CURL REQUIRED)
-add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c trace.c trace.h time.c time.h)
+add_executable(Connery main.c mpc.c util.c util.h hashtable.c hashtable.h cval.h cval.c trace.c trace.h)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(Connery PRIVATE /usr/lib/x86_64-linux-gnu/libedit.so ${CURL_LIBRARIES})
diff --git a/src/main.c b/src/main.c
index 156a08d..4429df3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1010,7 +1010,6 @@ cval *builtin_input(cenv *e, cval *a) {
}
cval *builtin_convert_string(cenv *e, cval *a) {
-
if (a->cell[0]->type == CVAL_NUMBER) {
int length = snprintf( NULL, 0, "%ld", a->cell[0]->num );
char* str = malloc( length + 1 );
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index ce20c1b..939aff7 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -1,4 +1,4 @@
-(fun {__ERROR__ msg critical} {
+(fun {__STANDARD_ERROR_HANDLER__ msg critical} {
(if (!= connery_system_lang "Connery Classic")
{(if (!= __STATEMENT_NUMBER__ -1)
@@ -22,21 +22,34 @@
(print "TRACE: ")
(if (>= __STATEMENT_NUMBER__ 3) {
- (print (join " " __PREV_PREV_EXPRESSION__))
- }{print "***"})
+ (print __PREV_PREV_EXPRESSION__)
+ }{})
(if (>= __STATEMENT_NUMBER__ 2) {
- (print (join " " __PREV_EXPRESSION__))
- }{print "**"})
+ (print __PREV_EXPRESSION__)
+ }{})
(if (>= __STATEMENT_NUMBER__ 1) {
- (print (join " " __EXPRESSION__))
- }{print "*"}) }
+ (print __EXPRESSION__)
+ }{}) }
{})
(if (== critical 1) {(log_fatal "critical error") (sys "HARD_EXIT")} {})
})
+(fun {__NOOP_ERROR_HANDLER__ msg critical} { })
+
+(def {standard_error_handler} __STANDARD_ERROR_HANDLER__)
+
+(fun {__ERROR__ msg critical} {
+(standard_error_handler msg critical)
+})
+
+(fun {mistakes mistake_bool} {
+if (mistake_bool)
+ {def {standard_error_handler} __STANDARD_ERROR_HANDLER__}
+ {def {standard_error_handler} __NOOP_ERROR_HANDLER__}})
+
(fun {panic msg} {
if (is_str msg)
{__ERROR__ msg 1}
@@ -47,5 +60,4 @@ if (is_str msg)
if (is_str msg)
{__ERROR__ msg 0}
{__ERROR__ (string_convert msg) 0}
-})
-
+})
\ No newline at end of file
diff --git a/src/time.c b/src/time.c
deleted file mode 100644
index 075b145..0000000
--- a/src/time.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "time.h"
-
-const char* current_time_string() {
-
-}
\ No newline at end of file
diff --git a/src/time.h b/src/time.h
deleted file mode 100644
index 68c39d5..0000000
--- a/src/time.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef CONNERY_TIME_H
-#define CONNERY_TIME_H
-
-typedef struct cval cval;
-
-
-
-#endif //CONNERY_TIME_H
diff --git a/src/util.c b/src/util.c
index 02b89b8..bb098d0 100644
--- a/src/util.c
+++ b/src/util.c
@@ -126,22 +126,4 @@ long get_factor(int init_digits) {
}
}
-char *replace_str(char *str, char *orig, char *rep)
-{
- static char buffer[4096];
- char *p;
- int i=0;
-
- while(str[i]){
- if (!(p=strstr(str+i,orig))) return str;
- strncpy(buffer+strlen(buffer),str+i,(p-str)-i);
- buffer[p-str] = '\0';
- strcat(buffer,rep);
- printf("STR:%s\n",buffer);
- i=(p-str)+strlen(orig);
- }
-
- return buffer;
-}
-
From 083336b0c52b13b0e1a14ee254d8f603339d7c7d Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 15:35:01 -0400
Subject: [PATCH 43/45] Added go_loud function to disable/enable logging
---
src/main.c | 2 --
src/stdlib/errors.connery | 2 +-
src/stdlib/logs.connery | 28 ++++++++++++++++++++++++++--
3 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/src/main.c b/src/main.c
index 4429df3..47d0868 100644
--- a/src/main.c
+++ b/src/main.c
@@ -11,9 +11,7 @@
#define SYSTEM_LANG 0
#define CONNERY_VERSION "0.0.1"
#define CONNERY_VER_INT 1
-#define REPORT_STATEMENT_NUMBERS 1
#define LOG_LEVEL 4
-#define ENABLE_FULL_TRACE false
#ifdef _WIN32
#include
diff --git a/src/stdlib/errors.connery b/src/stdlib/errors.connery
index 939aff7..a1747ea 100644
--- a/src/stdlib/errors.connery
+++ b/src/stdlib/errors.connery
@@ -17,7 +17,7 @@
{log_error (join (join "during file: " __SOURCE_FILE__) (join " with caushe: " msg))}
{log_error (join "with caushe: " msg)})})})
- (if (>= __LOG_LEVEL__ 4)
+ (if (>= log_level 4)
{
(print "TRACE: ")
diff --git a/src/stdlib/logs.connery b/src/stdlib/logs.connery
index 85e5fe2..9bc8c93 100644
--- a/src/stdlib/logs.connery
+++ b/src/stdlib/logs.connery
@@ -16,8 +16,8 @@
{(== i 5) "Without A Trashe"}
{Otherwise "Lishenshe To Kill"}})
-(fun {__LOG__ level msg} {
-if (>= __LOG_LEVEL__ level)
+(fun {__LEVELED_STANDARD_OUTPUT_LOG_HANDLER__ level msg} {
+if (>= log_level level)
{
(if (!= connery_system_lang "Connery Classic")
{(print (join (join (__log_level_num__ level) ": ") msg))}
@@ -26,6 +26,30 @@ if (>= __LOG_LEVEL__ level)
{}
})
+(fun {__NOOP_LOG_HANDLER__ level msg} {})
+
+(def {__DEFAULT_LOGGER__} __LEVELED_STANDARD_OUTPUT_LOG_HANDLER__)
+(def {interpreter_log_handler} __DEFAULT_LOGGER__)
+(def {__LOGGER_INIT_COMPLETE__} False)
+
+(fun {__LOG__ level msg} {
+if (__LOGGER_INIT_COMPLETE__) {
+interpreter_log_handler level msg
+} {
+(def {log_level} __LOG_LEVEL__)
+(interpreter_log_handler level msg)
+(def {__LOGGER_INIT_COMPLETE__} True)
+}})
+
+(fun {go_loud loud_bool} {
+(if (loud_bool)
+ {def {interpreter_log_handler} __DEFAULT_LOGGER__}
+ {def {interpreter_log_handler} __NOOP_LOG_HANDLER__})
+(if (loud_bool)
+ {if (< log_level 4) {(if (> __LOG_LEVEL__ 4) {(def {log_level} __LOG_LEVEL__)} {def {log_level} 4})} {}}
+ {if (> log_level 3) {(if (< __LOG_LEVEL__ 3) {(def {log_level} __LOG_LEVEL__)} {def {log_level} 3})} {}}
+)})
+
(fun {log_fatal msg} {__LOG__ 0 msg})
(fun {log_error msg} {__LOG__ 1 msg})
(fun {log_warn msg} {__LOG__ 2 msg})
From b0bd9e17e182924cdb1ff94ab451bbcec740e123 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 16:12:45 -0400
Subject: [PATCH 44/45] merge fix
---
Dockerfile | 16 +++++++++-------
src/main.c | 4 ++--
src/stdlib/Q.connery | 26 --------------------------
src/stdlib/functional.connery | 10 +++++++++-
src/stdlib/main.connery | 1 -
src/stdlib/versions.connery | 1 +
6 files changed, 21 insertions(+), 37 deletions(-)
delete mode 100644 src/stdlib/Q.connery
diff --git a/Dockerfile b/Dockerfile
index cf956ab..1a23667 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,9 +1,11 @@
FROM debian:buster
-WORKDIR /Connery
-COPY . .
RUN apt-get update
-RUN apt-get -y install make
-RUN apt-get -y install sudo
-RUN make -f Buildfile local.install
-RUN make -f Buildfile local.build
-ENTRYPOINT make -f Buildfile local.run
\ No newline at end of file
+RUN apt-get -y install build-essential
+RUN apt-get -y install cmake
+RUN apt-get -y install libcurl4-openssl-dev
+RUN apt-get -y install libedit-dev
+WORKDIR /Connery
+COPY src/. .
+RUN cmake .
+RUN cmake --build .
+ENTRYPOINT "./Connery" && /bin/bash
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 47d0868..ab49281 100644
--- a/src/main.c
+++ b/src/main.c
@@ -9,8 +9,8 @@
#include "trace.h"
#define SYSTEM_LANG 0
-#define CONNERY_VERSION "0.0.1"
-#define CONNERY_VER_INT 1
+#define CONNERY_VERSION "0.0.2"
+#define CONNERY_VER_INT 2
#define LOG_LEVEL 4
#ifdef _WIN32
diff --git a/src/stdlib/Q.connery b/src/stdlib/Q.connery
deleted file mode 100644
index 0f1d4a4..0000000
--- a/src/stdlib/Q.connery
+++ /dev/null
@@ -1,26 +0,0 @@
-(def {__Q_package_location__} "Q")
-(def {__Q_location__} "http://q.connerylang.org")
-(def {__Q_package_list_url_slug__} "/packages/packages_list.csv")
-(def {__Q_packages__} Null)
-
-(mkdir __Q_package_location__)
-
-(fun {__Q_package_scan__ packages package_name} {
- if (>= (length packages) 1)
- {if (== (first (first (head packages))) package_name)
- {first (head packages)}
- {__Q_package_scan__ (tail packages) package_name}}
- {Null}
-})
-
-(fun {Q package_name} {
- (if (is_null __Q_packages__)
- {def {__Q_packages__} (tail (csv (third (http_get (join __Q_location__ __Q_package_list_url_slug__)))))}
- {})
-
- (= {__package_result__} (__Q_package_scan__ __Q_packages__ package_name))
-
- (if (is_null __package_result__)
- {error (join "Package " package_name " not found!")}
- {print "False"})
-})
\ No newline at end of file
diff --git a/src/stdlib/functional.connery b/src/stdlib/functional.connery
index e0ed151..bc04457 100644
--- a/src/stdlib/functional.connery
+++ b/src/stdlib/functional.connery
@@ -12,4 +12,12 @@
{if (first (first cs))
{second (first cs)}
{unpack case (tail cs)}}
-})
\ No newline at end of file
+})
+
+; Currying
+(fun {unpack f l} {
+ eval (join (list f) l)
+})
+(fun {pack f & xs} {f xs})
+(def {curry} unpack)
+(def {uncurry} pack)
\ No newline at end of file
diff --git a/src/stdlib/main.connery b/src/stdlib/main.connery
index c7eecec..fc55ad3 100644
--- a/src/stdlib/main.connery
+++ b/src/stdlib/main.connery
@@ -9,7 +9,6 @@
(load "stdlib/errors.connery")
(load "stdlib/io.connery")
(load "stdlib/http.connery")
-(load "stdlib/calendar.connery")
(load "stdlib/versions.connery")
diff --git a/src/stdlib/versions.connery b/src/stdlib/versions.connery
index 82199af..2ac051f 100644
--- a/src/stdlib/versions.connery
+++ b/src/stdlib/versions.connery
@@ -2,6 +2,7 @@
case
{(== i 0) "Connery - Unspecified Version"}
{(== i 1) "Connery - 0.0.1 - The Legend Begins"}
+ {(== i 2) "Connery - 0.0.2"}
{(== i 9999) "Connery - Future Version"}
{Otherwise (error "Connery version is undefined.")}
})
From 905f27df7846ecb7d06d7ef50ad3add9770e82c1 Mon Sep 17 00:00:00 2001
From: Will Cipriano
Date: Sat, 1 May 2021 16:17:32 -0400
Subject: [PATCH 45/45] remove csv.connery
---
src/stdlib/csv.connery | 9 ---------
1 file changed, 9 deletions(-)
delete mode 100644 src/stdlib/csv.connery
diff --git a/src/stdlib/csv.connery b/src/stdlib/csv.connery
deleted file mode 100644
index d0876e7..0000000
--- a/src/stdlib/csv.connery
+++ /dev/null
@@ -1,9 +0,0 @@
-(fun {__parse_csv_loop__ csv_lines output}{
- if (== 0 (length csv_lines))
- {output}
- {__parse_csv_loop__ (tail csv_lines) (join output (list (delimit "," (eval (head csv_lines)))))}
-})
-
-(fun {csv csv_string} {
- __parse_csv_loop__ (delimit "\n" csv_string) None
-})
\ No newline at end of file