If we wanted a quick fix, we could have a locale vocabulary that calls some locale-format primitives in the VM.
On Thu, Aug 13, 2015 at 3:01 PM, Jon Harper <jon.harpe...@gmail.com> wrote: > So I looked into this, trying to solve it by calling printf through the > FFI with a locale setup and cleanup. > > The difficulty comes from the fact that printf is a variadic function.. > Factor's ffi doesn't support them, at least no in a cross platform manner, > right? > > So a workaround could be to wrap printf in C many times, compile that to a > shared library and call the different wrappers with the FFI depending on > the number of arguments and their types, but it would be nicer to have a > better support of variadic functions. > > Anyway, it (kind of) worked on linux x86_64 with the following code: > http://paste.factorcode.org/paste?id=3584 > Since printf is a variadic function, you have to use FUNCTION-ALIAS to > create functions with the correct number of arguments and the correct > types. So for example, > FUNCTION-ALIAS: mysnprintf-int2 int snprintf ( char* result, size_t size, > c-string format, int d, int d2 ) > would work too. > > However, passing floats didn't work on linux x86_64, because the system V > AMD64 ABI says that the number of float arguments must be in RAX before > calling the function, and factor always sets this to 0. With the following > diff, it worked for 1 float: > in cpu/x86/64/64.factor (and basis/cpu/x86/64/64.factor ??) > -M: x86.64 %prepare-var-args ( -- ) RAX RAX XOR ; > +M: x86.64 %prepare-var-args ( -- ) RAX 1 MOV ; > I don't know how hard it would be to generate the correct value for RAX > for variable arguments. > Also, I'm not sure if it works better for other ABI/platforms. > > Do you think that's something worth investigating ? > > > Jon > > On Wed, Aug 12, 2015 at 7:10 AM, Georg Simon <georg.si...@auge.de> wrote: > >> Am Tue, 11 Aug 2015 09:02:33 -0700 >> schrieb John Benediktsson <mrj...@gmail.com>: >> >> Thank you. So I didn't overlook existing locales support. >> >> > Properly supporting locales, even in a small way, would be a good >> > thing to add. >> > >> > Factor is currently locale-independent, partly because of a desire for >> > homoiconicity, and partly because it prevents things like tests that >> > break depending on the system locale[1]. >> > >> > We have discussed adding a locale vocabulary or a with-locale >> > combinator that can influence presentation of numbers and strings, >> > maybe looking at how other languages work[2]. Probably we'd want to >> > keep the math.parser locale independent, but provide ways for things >> > like present / printf to be locale-aware. >> > >> > If this is an issue for something you are building, you could use >> > alien.ffi to call sprintf or use C++ stringstream or something and >> > call the library from Factor, or do something slow like this, calling >> > out to Python: >> > >> > : format-with-locale ( n locale -- s ) >> > swap [ >> > "python" , "-c" , >> > "import locale; locale.setlocale(locale.LC_ALL, \"%s\"); >> > print(locale.format(\"%%f\", %s))" sprintf , >> > ] { } make B utf8 [ readln ] with-process-reader ; >> > >> > IN: scratchpad 1.5 "fr_FR" format-with-locale . >> > 1,500000 >> > >> > --- >> > [1] https://github.com/slavapestov/factor/issues/905 >> > [2] https://docs.python.org/3/library/locale.html >> >> >> ------------------------------------------------------------------------------ >> _______________________________________________ >> Factor-talk mailing list >> Factor-talk@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/factor-talk >> > > > > ------------------------------------------------------------------------------ > > _______________________________________________ > Factor-talk mailing list > Factor-talk@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/factor-talk > >
------------------------------------------------------------------------------
_______________________________________________ Factor-talk mailing list Factor-talk@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/factor-talk