aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-18 19:16:22 +0200
committerBad Diode <bd@badd10de.dev>2021-10-18 19:16:22 +0200
commit004d49dc5fc2a38aa1485dcd799dfe7cfd33902e (patch)
tree00705e441210c447c9224cae6015c6c6995ecf55
parentb9a80d8bbc568ae8e995fde0ea1710359ab4ab1c (diff)
downloadbdl-004d49dc5fc2a38aa1485dcd799dfe7cfd33902e.tar.gz
bdl-004d49dc5fc2a38aa1485dcd799dfe7cfd33902e.zip
Add rule110 to the examples
-rw-r--r--examples/rule110.bdl47
-rw-r--r--src/bootstrap/primitives.c12
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;