Mercurial > urweb
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; |