diff --git a/src/stdpath.ml b/src/stdpath.ml index f3cd19db9..c85a32af0 100644 --- a/src/stdpath.ml +++ b/src/stdpath.ml @@ -1 +1 @@ -let path = "/home/db/.opam/ocaml-system.4.07.1/share/Lama" +let path = "/home/db/.opam/4.07.1+fp/share/Lama" diff --git a/src/version.ml b/src/version.ml index 8e8bdb689..434ba2507 100644 --- a/src/version.ml +++ b/src/version.ml @@ -1 +1 @@ -let version = "Version 1.00, 674214cea, Sat Oct 31 02:17:44 2020 +0300" +let version = "Version 1.00, 695ddc7d8, Sat Oct 31 02:59:20 2020 +0300" diff --git a/stdlib/Collection.lama b/stdlib/Collection.lama index 2ec6e5610..ed09875aa 100644 --- a/stdlib/Collection.lama +++ b/stdlib/Collection.lama @@ -295,26 +295,36 @@ public fun foldSet (f, acc, s) { } -- Hash consing -public fun emptyMemo () { - ref (emptyMap (compare)) +public fun emptyCustomMemo (pred, compare) { + [pred, emptyMap (compare)] } -public fun lookupMemo (m, v) { +public fun emptyMemo () { +-- ref (emptyMap (compare)) + emptyCustomMemo ({}, compare) +} + +public fun lookupMemo (mm@[p, m], v) { + case p of + #fun -> if p (v) then return v fi + | _ -> skip + esac; + case v of #unboxed -> v | _ -> - case findMap (deref (m), v) of + case findMap (m, v) of Some (w) -> w | None -> case v of - #string -> m ::= addMap (deref (m), v, v); v + #string -> mm[1] := addMap (m, v, v); v | _ -> local vc = clone (v), i = case vc of #fun -> 1 | _ -> 0 esac; for skip, i < v.length, i := i + 1 do - local vci = lookupMemo (m, vc [i]); + local vci = lookupMemo (mm, vc [i]); vc [i] := vci od; - m ::= addMap (deref (m), vc, vc); + mm [1] := addMap (m, vc, vc); vc esac esac diff --git a/stdlib/Ostap.lama b/stdlib/Ostap.lama index 2e7d2bcf9..ee22d8637 100644 --- a/stdlib/Ostap.lama +++ b/stdlib/Ostap.lama @@ -18,7 +18,7 @@ public fun logOn () { public fun initOstap () { tab := ref (emptyHashTab (1024, hash, compare)); - restab := emptyMemo (); + restab := emptyCustomMemo (fun (x) {case x of #string -> true | _ -> false esac}, compare); hct := emptyMemo () }