M kabel/src/codegen.rs => kabel/src/codegen.rs +1 -1
@@ 602,7 602,7 @@ impl Codegen {
}
}
pub fn visit_call(&mut self, ast: &AST, ident: AST, args: Vec<AST>) {
- for arg in args.iter().rev() {
+ for arg in args.iter() {
self.visit(arg.clone());
}
self.visit(ident);
M kabel/src/main.rs => kabel/src/main.rs +6 -1
@@ 1,11 1,15 @@
//use std::{env, fs};
-use std::{env, fs};
+use std::{env, fs, process::exit};
use kabel::{debug::{debug_ast, debug_bytecode, debug_stack, debug_token_array}, run_codegen, run_lexer, run_parser, run_semantic_analysis};
fn main() {
let args: Vec<String> = env::args().collect();
+ if args.len() < 2 {
+ println!("Must provide kabel file to run");
+ exit(1);
+ }
let program =
fs::read_to_string(args[1].clone()).unwrap();
@@ 62,6 66,7 @@ fn main() {
output += "\n";
}
vm.unit_ptr = 0;
+ println!("{}", output);
output += "\n";
match vm.run(&mut output) {
M kabel/src/vm.rs => kabel/src/vm.rs +1 -5
@@ 325,12 325,8 @@ impl VM {
if num_args as usize != function.arity {
return Err(vm_error!(self, RuntimeErrorKind::IncorrectArity, "Function has {} arguments, {} provided", function.arity, num_args))
}
- self.stack_offset = self.stack.len()-1;
+ self.stack_offset = self.stack.len() - num_args as usize;
self.call_stack.push((self.unit_ptr, self.ip, self.stack_offset));
- for _ in 0..num_args {
- let arg = self.stack.pop().expect("Missing arguments in call");
- self.stack.push(arg);
- }
self.stack.insert(self.stack.len()-num_args as usize, Value::Fun(function));
self.ip = 0;
self.unit_ptr = function.unit_ptr as usize;
M kabel/tmp.kab => kabel/tmp.kab +3 -7
@@ 1,8 1,4 @@
-var add_one = (num) => {
- return num + 1;
-};
-function add_two(num) {
- return num + 2;
+function apply(fn, value) {
+ return fn(value);
}
-print add_one(1);
-print add_two(2);
+print apply((value) => { return value + 1; }, 1);