diff --git a/src/compiler.cpp b/src/compiler.cpp index 4fdc2db..2e76a92 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -867,6 +867,13 @@ Result Compiler::compile_let(Context& context, Symbol& op, return std::move(ex_res); } +Result Compiler::compile_do(Context& context, Symbol& op, + const Value& expr) { + auto rest = TRY(expr.rest()); + + return compile_body(context, rest); +} + Result Compiler::compile_body(Context& context, const Value& expr) { auto cur = TRY(expr.copy()); @@ -975,6 +982,8 @@ Result Compiler::compile_list(Context& context, const Value& expr) { return compile_fn(context, sym, expr); } else if (TRY(sym.cmp("let")) == 0) { return compile_let(context, sym, expr); + } else if (TRY(sym.cmp("do")) == 0) { + return compile_do(context, sym, expr); } else if (TRY(sym.cmp("quote")) == 0) { return compile_quote(context, sym, expr); } else if (TRY(sym.cmp("syntax")) == 0) { diff --git a/src/compiler.hpp b/src/compiler.hpp index 3329171..3237302 100644 --- a/src/compiler.hpp +++ b/src/compiler.hpp @@ -60,6 +60,8 @@ class Compiler { const Value& expr); Result compile_let(Context& context, Symbol& op, const Value& expr); + Result compile_do(Context& context, Symbol& op, + const Value& expr); Result compile_body(Context& context, const Value& expr); Result compile_function_call(Context& context, const Value& expr); diff --git a/test/function.vli b/test/function.vli index dbfe738..4b414d1 100644 --- a/test/function.vli +++ b/test/function.vli @@ -50,3 +50,8 @@ (assert (= (map '(1 2 3) (fn square (x) (* x x))) '(1 4 9))) + + +;; "do" form returns the value of last expression + +(assert (= (do 1 2 3) 3))