Broccoli version 0.0.b
I’m chugging along on the Broccoli interpreter adding the following:<br/>
fast lists
Lists are backed by arrays now, so random access is O(1). I was considering making an extra array type, but the array-backed list will work just as well and keep the type system cleaner.
for loops
I have added a for loop that works as both a list iterator and a range iterator. I was considering using only the former form, but that would have been a bit messy behind the scenes in the way that the recognition of ranges would need to occur. The BNF of the for loop is as follows:<br/> List iteration form:<br/>
<list iteration for> ::= (for <scalar-variable> in <list> <expression>*)
Range iteration form:<br/>
<range iteration for> ::= (for <scalar-variable> in <start-index> to <end-index> <expression>*) <start-index> ::= <integer> | <scalar-variable> <end-index> ::= <integer> | <scalar-variable>
<br/> In the list iteration case, the scalar-variable will be the currently indexed element in the list. In order to obtain the current index count for this case, the special variable <scalar-variable>-index is provided. In the range iteration case, the scalar-variable is the loop index.<br/>
if-then-else
Basic if-then-else statements are provided of the form:
<if-then-else> ::= (if <boolean-condition> <expression>* else <expression>)
functions
Functions are now provided. Recursion is possible, although tail-recursion will trash the stack at around 16K calls deep.<br/> Functions take the form:<br/>
<function> ::= (fn <name> (<parameter>*) <expression>*) <name> ::= <symbol> <parameter> ::= <symbol>
<br/>
An example of the solution for your Week 1 undergrad C.S. assignment would therefore be:
(fn fib ($num) (if (< $num 2) $num else (+ (fib (- $num 1)) (fib (- $num 2))) ) ) (fn fact ($num) (if (== $num 0) 1 else (* $num (fact (- $num 1))) ) )
-m
No Comments, Comment or Ping
Reply to “Broccoli version 0.0.b”