commit 2cc247137d27d4ab36719a37f2219e1858450385
parent af7eff7a7dfa76a8d905c9f2587cdf1b2a68ca74
Author: Demonstrandum <moi@knutsen.co>
Date:   Tue, 30 Jul 2019 01:09:02 +0100
Update description.
Diffstat:
4 files changed, 40 insertions(+), 19 deletions(-)
diff --git a/README.md b/README.md
@@ -2,22 +2,35 @@
   <img alt="Valhalla Flag" height=230 src="https://github.com/Demonstrandum/valhalla/raw/master/assets/logo.svg.png" />
 </p>
 
-# Valhalla Language
+# Valhalla Programming Language
 
-## IN DEVELOPMENT
+## IN (HEAVY) DEVELOPMENT
+
+What's been done so far on the front-end:
 
-What's been done so far on the front end:
 - [ ] Parser
-  - [x] Lexical analysis, full UTF-8 support, handling: identifiers, symbols, numbers, strings (utf-8 with good number of escapes), all sorts of braces for vectors, sets, grouping, etc.
+  - [x] Lexical analysis, full UTF-8 support, handling: identifiers,
+        symbols, numbers, strings (utf-8 with a good number of escapes),
+        all sorts of braces for: vectors, sets and grouping, etc.
   - [x] Infix, prefix and suffix notation.
   - [x] Correct parsing of precedence, arity and associativity.
   - [x] The base operators for the language.
-  - [x] Proper function calls, Currying is properly implemented for functions (Haskell-like syntax).
-  - [x] (Cool) error messages, with line and column number and read-out of the line.
-  - [ ] Macros (incl. macro definitions and macro application).
+  - [x] Proper function calls, Currying / partial application
+        of functions is properly implemented (Haskell-like functions).
+  - [x] Error messages, with fancy line and column number and read-out of the source line.
+  - [x] Constant folding optimisations on trivially deducible
+        numeric computations at compile time.
+  - [ ] Macros (including macro definitions and macro application).
+  - [ ] User-defined binary operators as aliases to functions.
 - [ ] Compiler (generating bytecode to assemble an executable file).
   - [x] Table of constants and locals with basic PUSH & POP
         instructions as well as basic arithmetic.
+  - [x] Access, assignment and retrieval of local variables within
+        code-block scope.
+  - [ ] Track variable and function types.
+  - [ ] Marshaling, i.e. serialising the bytecode and storing it in a file
+        for future interpretation and execution by the virtual machine.
+  - [ ] ...
 
 The VM, i.e. the backend for the language, is being developed independently
 and will have its own progress and check-list updates.
@@ -25,22 +38,21 @@ and will have its own progress and check-list updates.
 ### Description
 
 This repository contains the front-end (parser and
-bytecode compilation) which understands the syntax and
-semantics, as well as doing static type analysis and code
-optimisation. The generated AST is then compiled to
-Brokkr bytecode.
+bytecode compilation) which processes the syntax and
+semantics of the source code. The generated AST is then
+compiled to [Brokkr VM](https://github.com/Demonstrandum/brokkr) bytecode.
 The execution of the subsequent bytecode
 is handled by the language's VM (virtual machine) called
-Brokkr, which exists separately.
+Brokkr, which exists separately from this repository.
 
-Valhalla is a set theoretic programming language.
+Valhalla is a set-theoretic programming language.
 That's to say, it's based on principles from set theory,
 in a way that all types are just sets, and hence everything
 is just an element of a set. The language is meant to give a
-new way to think about types, and provides an intuitive way to
-think about types.  It may also be used to verify proofs and such
-about set theory.
+new way to interact with types, and provides an intuitive way to
+think about them.  A goal is that it may also be used to
+verify proofs and such in and around set theory.
 
-The language is a general purpose, but instead of being all OOP,
+The language is a general purpose, but instead of being totally object-oriented,
 or functional, etc., it's just set theory based.  From what I've
 gathered, it's not a very popular paradigm.
diff --git a/src/compiler/block.rs b/src/compiler/block.rs
@@ -115,14 +115,16 @@ impl<'a> LocalBlock<'a> {
                     // Check for fast internal binary operations such as +, -, *, /, etc.
                     let maybe_op = internal_functions::get_internal_op(&ident.value, Some(&args));
                     if let Some(op) = maybe_op {
-                        self.emit(args[0]);
                         self.emit(args[1]);
+                        self.emit(args[0]);
                         self.instructions.push(op);
                         return;
                     }
                 }
                 self.emit(&call_node.operands[0]);
                 self.emit(&*call_node.callee);
+                self.instructions.push(Instr::Operator(Operators::CALL_N as u8));
+                self.instructions.push(Instr::Operand(2));
             },
             _ => ()
         };
diff --git a/src/compiler/instructions.rs b/src/compiler/instructions.rs
@@ -39,6 +39,7 @@ pub enum Operators {
     DUP         = 6,
     DUP_N       = 7,
     SWAP        = 8,
+    CALL_N      = 9,
 
     N_ADD       = 40,
     I_ADD       = 41,
@@ -76,6 +77,7 @@ impl fmt::Display for Operators {
             Operators::DUP         => "DUP\n",
             Operators::DUP_N       => "DUP_N",
             Operators::SWAP        => "SWAP\n",
+            Operators::CALL_N      => "CALL_N",
 
             Operators::N_ADD       => "N_ADD\n",
             Operators::I_ADD       => "I_ADD\n",
diff --git a/src/syntax/analyser.rs b/src/syntax/analyser.rs
@@ -53,7 +53,12 @@ fn constant_fold(node : &ast::Nodes) -> Option<ast::Nodes> {
                 "+" => l_value + r_value,
                 "-" => l_value - r_value,
                 "*" => l_value * r_value,
-                "/" => l_value / r_value,
+                "/" => {
+                    if r_value == ast::Numerics::Natural(0) {
+                        return None;
+                    }
+                    l_value / r_value
+                },
                 _ => return None
             };
             return Some(ast::Nodes::Num(ast::NumNode { value }));