From 004d49dc5fc2a38aa1485dcd799dfe7cfd33902e Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 18 Oct 2021 19:16:22 +0200 Subject: Add rule110 to the examples --- examples/rule110.bdl | 47 ++++++++++++++++++++++++++++++++++++++++++++++ src/bootstrap/primitives.c | 12 +++++++----- 2 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 examples/rule110.bdl 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 @@ +(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)) + +(fun reverse (ls) + (fun rev-acc (ls acc) + (if (nil? ls) + acc + (rev-acc (cdr ls) (cons (car ls) acc)))) + (rev-acc ls '())) + +(fun print-line (seq) + (if (or (nil? seq) (= 0 (car seq))) + (print " ") + (print "🖤")) + (if (not (nil? seq)) (print-line (cdr seq)))) + +(fun rule-110 (seq n) + (print-line seq) + (newline) + (fun new-generation (lst seq) + (def a (if (nil? seq) 0 (car seq))) + (def b (if (or (nil? seq) + (nil? (cdr seq))) + 0 + (car (cdr seq)))) + (def c (if (or (nil? seq) + (nil? (cdr seq)) + (nil? (cdr (cdr seq)))) + 0 + (car (cdr (cdr seq))))) + (def number (+ (* a 2 2) (* b 2) c)) + (def cell (cond ((= number 0) 0) + ((= number 1) 1) + ((= number 2) 1) + ((= number 3) 1) + ((= number 4) 0) + ((= number 5) 1) + ((= number 6) 1) + ((= number 7) 0))) + (if (nil? (cdr seq)) + lst + (new-generation (cons cell lst) (cdr seq)))) + (def seq (cons 0 (reverse (new-generation '() seq)))) + (if (= n 0) + () + (rule-110 seq (- n 1)))) + +(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: return obj_err; } if (value == obj_nil) { - error_push((Error){ - .type = ERR_TYPE_RUNTIME, - .value = ERR_NOT_ENOUGH_ARGS, - }); - return obj_err; + // Need to reconsider this, it can cause issues when + // arguments contain a random nil + // error_push((Error){ + // .type = ERR_TYPE_RUNTIME, + // .value = ERR_NOT_ENOUGH_ARGS, + // }); + // return obj_err; } env_add_or_update_current(tmp, symbol, value); args = args->cdr; -- cgit v1.2.1