diff options
-rw-r--r-- | examples/rule110.bdl | 47 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 12 |
2 files changed, 54 insertions, 5 deletions
diff --git a/examples/rule110.bdl b/examples/rule110.bdl new file mode 100644 index 0000000..abc89a9 --- /dev/null +++ b/examples/rule110.bdl | |||
@@ -0,0 +1,47 @@ | |||
1 | (def sequence (list 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1)) | ||
2 | |||
3 | (fun reverse (ls) | ||
4 | (fun rev-acc (ls acc) | ||
5 | (if (nil? ls) | ||
6 | acc | ||
7 | (rev-acc (cdr ls) (cons (car ls) acc)))) | ||
8 | (rev-acc ls '())) | ||
9 | |||
10 | (fun print-line (seq) | ||
11 | (if (or (nil? seq) (= 0 (car seq))) | ||
12 | (print " ") | ||
13 | (print "🖤")) | ||
14 | (if (not (nil? seq)) (print-line (cdr seq)))) | ||
15 | |||
16 | (fun rule-110 (seq n) | ||
17 | (print-line seq) | ||
18 | (newline) | ||
19 | (fun new-generation (lst seq) | ||
20 | (def a (if (nil? seq) 0 (car seq))) | ||
21 | (def b (if (or (nil? seq) | ||
22 | (nil? (cdr seq))) | ||
23 | 0 | ||
24 | (car (cdr seq)))) | ||
25 | (def c (if (or (nil? seq) | ||
26 | (nil? (cdr seq)) | ||
27 | (nil? (cdr (cdr seq)))) | ||
28 | 0 | ||
29 | (car (cdr (cdr seq))))) | ||
30 | (def number (+ (* a 2 2) (* b 2) c)) | ||
31 | (def cell (cond ((= number 0) 0) | ||
32 | ((= number 1) 1) | ||
33 | ((= number 2) 1) | ||
34 | ((= number 3) 1) | ||
35 | ((= number 4) 0) | ||
36 | ((= number 5) 1) | ||
37 | ((= number 6) 1) | ||
38 | ((= number 7) 0))) | ||
39 | (if (nil? (cdr seq)) | ||
40 | lst | ||
41 | (new-generation (cons cell lst) (cdr seq)))) | ||
42 | (def seq (cons 0 (reverse (new-generation '() seq)))) | ||
43 | (if (= n 0) | ||
44 | () | ||
45 | (rule-110 seq (- n 1)))) | ||
46 | |||
47 | (rule-110 sequence 25) | ||
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c index 7ac9bf7..9960688 100644 --- a/src/bootstrap/primitives.c +++ b/src/bootstrap/primitives.c | |||
@@ -124,11 +124,13 @@ eval_lambda: | |||
124 | return obj_err; | 124 | return obj_err; |
125 | } | 125 | } |
126 | if (value == obj_nil) { | 126 | if (value == obj_nil) { |
127 | error_push((Error){ | 127 | // Need to reconsider this, it can cause issues when |
128 | .type = ERR_TYPE_RUNTIME, | 128 | // arguments contain a random nil |
129 | .value = ERR_NOT_ENOUGH_ARGS, | 129 | // error_push((Error){ |
130 | }); | 130 | // .type = ERR_TYPE_RUNTIME, |
131 | return obj_err; | 131 | // .value = ERR_NOT_ENOUGH_ARGS, |
132 | // }); | ||
133 | // return obj_err; | ||
132 | } | 134 | } |
133 | env_add_or_update_current(tmp, symbol, value); | 135 | env_add_or_update_current(tmp, symbol, value); |
134 | args = args->cdr; | 136 | args = args->cdr; |