Skip to content

Instantly share code, notes, and snippets.

@khayyamsaleem
Created October 27, 2017 00:47
Show Gist options
  • Save khayyamsaleem/5f828814c804d979019a013b583e2cc4 to your computer and use it in GitHub Desktop.
Save khayyamsaleem/5f828814c804d979019a013b583e2cc4 to your computer and use it in GitHub Desktop.
%Khayyam Saleem, Ryan Edelstein
%We pledge our honors that we have abided by the Stevens Honor System.
%Finished before Prof. reviewed in lecture, feeling very good.
-module(calc).
-compile([calc/2]).
calc([], {var, _S})->
erlang:error('Variable not in env');
calc([[K,V]|_T], {var, S}) when S == K ->
{const, V};
calc([[_K,_V]|T], {var, S}) ->
calc(T, {var, S});
calc(_Env, {const, I})->
{const, I};
calc(_Env, {add, {const, A}, {const, B}}) ->
{const, A+B};
calc(Env, {add, E1, E2})->
calc(Env, {add, calc(Env, E1), calc(Env, E2)});
calc(_Env, {sub, {const, A}, {const, B}}) ->
{const, A-B};
calc(Env, {sub, E1, E2})->
calc(Env, {sub, calc(Env, E1), calc(Env, E2)});
calc(_Env, {mul, {const, A}, {const, B}}) ->
{const, A*B};
calc(Env, {mul, E1, E2})->
calc(Env, {mul, calc(Env, E1), calc(Env, E2)});
calc(_Env, {divi, {const, A}, {const, B}}) ->
{const, A div B};
calc(Env, {divi, E1, E2})->
calc(Env, {divi, calc(Env, E1), calc(Env, E2)});
calc(_Env, {eq, {const, A}, {const, B}})->
{bool, A == B};
calc(_Env, {eq, {bool, A}, {bool, B}})->
{bool, A == B};
calc(Env, {eq, E1, E2})->
calc(Env, {eq, calc(Env, E1), calc(Env, E2)});
calc(_Env, {fact, {const, A}}) when A < 0 ->
erlang:error('cannot compute fact of neg const');
calc(_Env, {fact, {bool, _}})->
erlang:error('Type error: cannot compute fact of bool');
calc(_Env, {fact, {const, 0}})->
{const, 1};
calc(Env, {fact, E1})->
calc(Env, {mul, calc(Env, E1), calc(Env, {fact, calc(Env, {sub, calc(Env, E1), {const, 1}})})}).
testEnv() ->
[["x", 5], ["y", 3]].
main(_) ->
io:fwrite("~p.~n", [
calc(testEnv(), {fact, {var, "x"}})
]).
% calc(testEnv(), {eq, {add, {mul, {var, "x"},
% {const, 2}},
% {const, -30}},
% {sub, {const, 10},
% {mul, {var, "y"},
% {add, {const, 5},
% {divi, {const, 25},
% {var, "x"}}}}}})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment