File: finalize.6.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (55 lines) | stat: -rw-r--r-- 1,113 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
structure Bug =
struct 

  structure F = MLton.Finalizable

  fun new_t () =
      let 
        val p = 0
        val t = F.new p
        fun finalize x = ()
      in
        F.addFinalizer(t,finalize);
        t
      end

  fun from_string (_:string) = 
      let
        val x = new_t ()
      in
        F.withValue(x,fn p => ());
        x
      end

  val zero = from_string "0.0"

  (* NOTE: I removed the F.withValue lines in an attempt to make the
   code simpler, but the bug didn't manifest itself.  So I think these
   lines are critical. *)
  fun plus (x,y) = 
      let
        val z = new_t ()
      in
        F.withValue(x,fn xp => 
          F.withValue(y,fn yp => 
            F.withValue(z,fn zp => 
              let in
                z
              end)))
      end

end
 
structure B = Bug

fun bigsum (n,store) =
    if n = 0 then store else
    let
      val _ = if Int.mod(n,10000) = 0 then print (Int.toString n ^ "\n") else ()
    in
      bigsum(Int.-(n,1),B.plus(store,B.from_string(Int.toString n ^ ".0")))
    end

val bigsum = (fn n => bigsum(n,B.zero))

val x = bigsum 5000000