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 <benap...@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 <tstarl...@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@lists.wikimedia.org
>> https://lists.wikimedia.org/mailman/listinfo/wikitech-l

_______________________________________________
Wikitech-l mailing list
Wikitech-l@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to