2016-03-13 21:36 GMT+03:00 Bram Moolenaar <[email protected]>:
>
> Nikolay Pavlov wrote:
>
>> 2016-03-13 18:06 GMT+03:00 Bram Moolenaar <[email protected]>:
>> >
>> > I have a note about adding a way that a callback can be invoked at a
>> > certain time.  I would like to know how this is going to be used, what
>> > the requirements for this feature are.
>> >
>> > I imagine there are two kinds of timers:
>> >
>> > 1. One-time:  After N msec the callback is invoked.
>> > 2. Repating:  invoke the callback every N msec
>> >
>> > For both this will happen while waiting for a character, thus the actual
>> > wait time will be longer if the user is typing.
>> >
>> > Example:
>> >
>> >         let timer = timer_add({time}, {callback} [, {repeats} [, 
>> > {cookie}]])
>> >         call timer_stop(timer)
>> >
>> >         func MyTimerCallback(timer, cookie)
>> >
>> > Would that satisfy the need?
>> >
>> > I think it would be good that if the callback causes an error the timer
>> > is stopped.
>>
>> I would say that dictionary is better then four arguments:
>>
>> 1. It enables feature used by Neovim for callbacks: dictionary that
>> defined timer is passed as a `self` dictionary to a dictionary
>> function, while in your variant dictionary functions cannot be used at
>> all.
>> 2. This allows adding more options in the future. E.g. alter error
>> handling, silence function or add a timeout after which callback is
>> interrupted.
>> 3. Dictionary may serve both as `timer` and as a `cookie`.
>>
>> E.g.
>>
>>     let def = {
>>         \ 'interval': Number|Float (seconds),
>>         \ 'callback': String|Funcref,
>>         \ 'repeats': Number (optional),
>>         \ 'Cookie': … (keys matching `^[a-z]\+$` are reserved for Vim)}
>>     call timer_add(def)
>>     call timer_stop(def)
>>
>>     function Callback() dict
>>     endfunction
>
> That's very different from how existing functions work.
>
> The "cookie" can be a dictionary, thus one can use that.  Passing the
> function argument back in to the callback looks weird.  What we would
> actually want is a closure.  Then the cookie is not needed.

Argument being passed is a dictionary containing function, not the
function. And this does not look weird at all, every OOP library
written in VimL I saw does the same thing.

>
> We could make this generic:
>         let closure = function('Callback', arg1, arg2)
> Would invoke:
>         func Callback(arg1, arg2, other-args)

This is currying (partial application), not closure. Closure is

    function Outer()
        let l:test = 1
        let l:d = {}
        function d.inner()
            return l:test
        endfunction
        return d.inner
    endfunction

    let Closure = Outer()
    echo Closure()

>
> We might need more options later, that's true.  But the time and
> callback are always needed.  Thus I would prefer:
>
>         let timer = timer_start({time}, {callback}, {options})

Do you mean that `options` here will be `self`? It is fine as long as
dictionary functions can be used.

>
>
> --
> hundred-and-one symptoms of being an internet addict:
> 38. You wake up at 3 a.m. to go to the bathroom and stop and check your e-mail
>     on the way back to bed.
>
>  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
> ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
> \\\  an exciting new programming language -- http://www.Zimbu.org        ///
>  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui