Slight fixups: let all_items = ref ([] : string list) let add_item item = (all_items := item :: !all_items ; item) let item1 = add_item "hello" let item2 = add_item "world" let all_items = List.rev !all_items On Fri, Aug 9, 2019 at 7:53 AM Josh Berdine wrote: > What about good old-fashioned state: > > let all_items = ref [] > let add_item item = all_items := (item :: !all_items, item) > > let item1 = add_item "hello" > let item2 = add_item "world" > > let all_items = List.rev !all_items > > > On 9 Aug 2019, at 15:27, Richard W.M. Jones wrote: > > > Let's imagine you have a list of named things, but you also want to > > collect them up into a single list. For example: > > > > let item1 = "hello" > > let item2 = "world" > > let all_items = [ item1; item2 ] > > > > let () = > > printf "item1 = %s\n" item1; > > printf "all_items = %s\n" (String.concat ", " all_items) > > > > This is fine, but there's a danger that a programmer could add item3 > > but forget to add it to the "all_items" list. (In the real world > > problem to which this applies, my items are complex and lengthy > > structures, and the "all-things-list" is well off the bottom of the > > page when you're viewing the top item). > > > > My idea to fix this was to write: > > > > let all_items = [ > > ("hello" as item1); > > ("world" as item2); > > ] > > > > Actually I was slightly surprised to find this doesn't compile. I > > guess because "as" can only be used like this in patterns, not > > expressions. Also the scoping is wrong because the "as item1" if it > > worked probably wouldn't apply outside the list. > > > > I haven't worked out if it's possible to write this in ordinary OCaml, > > although I suppose ppx could solve it. Any ideas if this is possible? > > > > Rich. >