comparison lib/js/urweb.js @ 974:b851675a2c3d

Compiled an 'option' pattern-match
author Adam Chlipala <adamc@hcoop.net>
date Tue, 22 Sep 2009 14:15:29 -0400
parents e30c2409c9d0
children 8fe576c0bee9
comparison
equal deleted inserted replaced
973:e30c2409c9d0 974:b851675a2c3d
799 env = env.next; 799 env = env.next;
800 } 800 }
801 } 801 }
802 802
803 throw "Out-of-bounds Ur variable reference"; 803 throw "Out-of-bounds Ur variable reference";
804 }
805
806 function execP(env, p, v) {
807 switch (p.c) {
808 case "w":
809 return env;
810 case "v":
811 return cons(v, env);
812 case "c":
813 if (v == p.v)
814 return env;
815 else
816 return false;
817 case "s":
818 if (v == null)
819 return false;
820 else
821 return execP(env, p.p, p.n ? v.v : v);
822 case "1":
823 if (v.n != p.n)
824 return false;
825 else
826 return execP(env, p.p, v.v);
827 case "r":
828 for (var fs = p.l; fs != null; fs = fs.next) {
829 env = execP(env, fs.data.p, v["_" + fs.data.n]);
830 if (env == false)
831 return false;
832 }
833 return env;
834 default:
835 throw ("Unknown Ur pattern kind" + p.c);
836 }
804 } 837 }
805 838
806 function exec0(env, e) { 839 function exec0(env, e) {
807 var stack = null; 840 var stack = null;
808 841
870 break; 903 break;
871 case ";": 904 case ";":
872 e = fr.e2; 905 e = fr.e2;
873 stack = stack.next; 906 stack = stack.next;
874 break; 907 break;
875 case "=1":
876 env = cons(v, env);
877 e = fr.e2;
878 stack = stack.next;
879 break;
880 case "=": 908 case "=":
881 env = cons(v, env); 909 env = cons(v, env);
882 e = fr.e2; 910 e = fr.e2;
883 stack = cons({c: "a3", env: env}, stack.next); 911 stack = cons({c: "a3", env: env}, stack.next);
912 break;
913 case "m":
914 var ps;
915 for (ps = fr.p; ps != null; ps = ps.next) {
916 var r = execP(env, ps.data.p, v);
917 if (r != false) {
918 stack = cons({c: "a3", env: env}, stack.next);
919 env = r;
920 e = ps.data.b;
921 break;
922 }
923 }
924 if (ps == null)
925 throw "Match failure in Ur interpretation";
884 break; 926 break;
885 default: 927 default:
886 throw ("Unknown Ur continuation kind " + fr.c); 928 throw ("Unknown Ur continuation kind " + fr.c);
887 } 929 }
888 930
934 break; 976 break;
935 case "=": 977 case "=":
936 stack = cons({c: "=", e2: e.e2}, stack); 978 stack = cons({c: "=", e2: e.e2}, stack);
937 e = e.e1; 979 e = e.e1;
938 break; 980 break;
981 case "m":
982 stack = cons({c: "m", p: e.p}, stack);
983 e = e.e;
984 break;
939 case "e": 985 case "e":
940 var env0 = env; 986 var env0 = env;
941 var e0 = e.e; 987 var e0 = e.e;
942 e = {c: "c", v: cs(function() { return exec0(env0, e0); })}; 988 e = {c: "c", v: cs(function() { return exec0(env0, e0); })};
943 break; 989 break;