Tim, is there any code publicly available for the new extension you
talk about? I would like to see it, if it exist (and isn't anything
secret).
On Fri, Apr 13, 2012 at 2:12 PM, Petr Bena <benapetr(a)gmail.com> wrote:
I have no knowledge of Lua, but I don't see what
is problem with print
here, the function print is supposed to print output to output device
in most of programming languages, just as in this case, so I don't
understand why we should want to use return (which is supposed to
return some data / pointer back to function it was called from) in
this case? I mean if we can pick if we should use print or return as
recommended way to print text, I would vote for print(), especially if
it has better performance that the implementation using return.
On Fri, Apr 13, 2012 at 1:45 PM, Tim Starling <tstarling(a)wikimedia.org> wrote:
> At the moment, in the Lua support extension we have been developing,
> wikitext is output to the wiki via the return value of a function. For
> example in wikitext you would have:
>
> {{#invoke:MyModule|myFunction}}
>
> Then in [[Module:MyModule]]:
>
> local p = {}
> function p.myFunction()
> return 'Hello, world!'
> end
> return p
>
> This is all nice and elegant and will work. There is an alternative
> convention commonly used in scripting languages (and programming in
> general for that matter), using a print function:
>
> local p = {}
> function p.myFunction()
> print('Hello, world!')
> end
> return p
>
> I would have been happy to leave it as Victor Vasiliev made it, i.e.
> using return values, but I happened across a performance edge case in
> Lua which made me think about it. Specifically, this:
>
> function foo(n)
> s = ''
> for i = 1, n do
> s = s .. toString(i)
> end
> return s
> end
>
> has O(n^2) running time. For 100,000 iterations it takes 5 seconds on
> my laptop. Apparently this is because strings are immutable, so the
> accumulator needs to be copied for each concatenation. It's very
> similar to the situation in Java, where a StringBuffer needs to be
> used in such an algorithm.
>
> It's easy enough to work around, but the problem is obscure enough
> that I think probably most of our users will not realise they need to
> work around it until it becomes severe.
>
> It would be possible to provide a print() function which does not
> suffer from this problem, i.e.
>
> function foo(n)
> for i = 1, n do
> print(i)
> end
> end
>
> could run in O(n log(n)) time. Intuitively, I would expect that
> providing such a print function would encourage a programming style
> which would avoid at least some instances of repetitive concatenation.
>
> The performance issue is probably no big deal, since most templates
> are probably not going to be concatenating hundreds of thousands of
> strings, and 5 seconds is still quicker than the time it takes most of
> our featured articles to render at the moment. But like I say, it got
> me thinking about it.
>
> Does anyone have any thoughts on return versus print generally? Are
> there other reasons we would choose one over the other?
>
> -- Tim Starling
>
>
> _______________________________________________
> Wikitech-l mailing list
> Wikitech-l(a)lists.wikimedia.org
>
https://lists.wikimedia.org/mailman/listinfo/wikitech-l