| Anonymous | Login | Signup for a new account | 2013-05-18 11:00 CEST | ![]() |
| Main | My View | View Issues | Change Log | Roadmap |
| View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||||||
| ID | Project | Category | View Status | Date Submitted | Last Update | |||||||
| 0005493 | OCaml | OCaml general | public | 2012-01-26 10:34 | 2012-01-30 16:34 | |||||||
| Reporter | johnwhitington | |||||||||||
| Assigned To | lefessan | |||||||||||
| Priority | normal | Severity | minor | Reproducibility | always | |||||||
| Status | resolved | Resolution | not fixable | |||||||||
| Platform | OS | OS Version | ||||||||||
| Product Version | ||||||||||||
| Target Version | Fixed in Version | |||||||||||
| Summary | 0005493: Pervasives.string_of_bool doesn't create new string | |||||||||||
| Description | feast:trunk john$ ocaml Objective Caml version 3.12.1 # let x = string_of_bool false;; val x : string = "false" # x.[3] <- 'x';; - : unit = () # x;; - : string = "falxe" # string_of_bool false;; - : string = "falxe" Is this the intended behaviour? It seems to break abstraction somewhat. Solution would be to use string_blit and string_create from pervasives.ml to build a new string each time. I would be happy to write the patch if required. | |||||||||||
| Tags | No tags attached. | |||||||||||
| Attached Files | ||||||||||||
Notes |
|
|
(0006804) protz (manager) 2012-01-26 10:37 |
Other funny example: # let f () = "toto";; val f : unit -> string = <fun> # let v = f () in v.[1] <- 'a';; - : unit = () # f ();; - : string = "tato" There was a discussion about that on the caml-list, you may be able to find it by crawling the archives of the google group. The tl;dr is that strings are optimized, and shared; therefore, you shouldn't think of them as something mutable. I'm inclined to close this as "not a problem" but I'll wait for others to weigh in... |
|
(0006805) johnwhitington (reporter) 2012-01-26 10:56 |
I guess that makes sense. I just found it confusing on a fundamental API boundary. Perhaps it deserves mention in the documentation? |
|
(0006806) protz (manager) 2012-01-26 11:04 |
Well I guess a small disclaimer somewhere near the documentation of the [String] module would be worthwhile. I'll check with others see if we should recommend some sort of rope library for efficient sharing... |
|
(0006807) lefessan (developer) 2012-01-26 11:27 |
I changed the documentation of Pervasives.string_of_bool to state that the returned value may be shared and should not be modified directly. A lot of functions that return strings should actually be documented in the same way, for example when some of them may return the value received as argument when no modification is required. Users should use String.copy to guarantee that they are no modifying a shared string. |
|
(0006846) protz (manager) 2012-01-30 16:34 |
r12102 also adds an extra comment in string.mli about that "feature" |
Issue History |
|||
| Date Modified | Username | Field | Change |
| 2012-01-26 10:34 | johnwhitington | New Issue | |
| 2012-01-26 10:37 | protz | Note Added: 0006804 | |
| 2012-01-26 10:56 | johnwhitington | Note Added: 0006805 | |
| 2012-01-26 11:04 | protz | Note Added: 0006806 | |
| 2012-01-26 11:27 | lefessan | Note Added: 0006807 | |
| 2012-01-26 11:27 | lefessan | Status | new => resolved |
| 2012-01-26 11:27 | lefessan | Resolution | open => not fixable |
| 2012-01-26 11:27 | lefessan | Assigned To | => lefessan |
| 2012-01-30 16:34 | protz | Note Added: 0006846 | |
| Copyright © 2000 - 2011 MantisBT Group |