Thomas wrote:
> And part #3:
>
> Let's consider the following code in file foo.vim:
>
> function! s:Foo() dict
> echo self.data
> endf
>
> let g:foo = {'data': 'bar', 'Foo': function('s:Foo')}
>
> Now, when I type:
>
> :source foo.vim
> :echo g:foo.Foo()
>
> I get the following error:
> E120: Using <SID> not in a script context: s:Foo
> E15: Invalid expression: g:foo.Foo()
>
> When I place this in a file bar.vim and do :so bar.vim, I get:
> E117: Unknown function: s:Foo
> E15: Invalid expression: g:foo.Foo()
>
> From the help text on function()
>
> > function({name}) *function()* *E700*
> > Return a |Funcref| variable that refers to function {name}.
> > {name} can be a user defined function or an internal function.
>
> I concluded that this function would do more that just storing the
> functions name as string. Based on my example, it seems I was wrong. Not
> being able to refer to script local functions, IMHO makes function()
> rather pointless, I'd say.
It's very simple: script-local functions can only be used in the script
where they are defined. If you want a dictionary-local function you
should use ":help numbered-function".
> One can work around the problem by using the trick described in :help
> <SID> though.
>
> I also noticed some inconsistency with respect to whether funcrefs can
> only be assigned to variables beginning with an upper-case letter.
>
> Vim doesn't complain about
>
> let g:foo = {'data': 'bar', 'foo': function('s:Foo')}
> call g:foo.foo()
>
> but it throws E704 when doing:
>
> let ffoo = function('s:Foo')
>
> From my experience with this, I'd say that this is too restrictive as,
> e.g., call() also accepts a string. So a code like the following is
> basically correct but won't be accepted by vimscript:
>
> fun! Example(arg)
> echo a:arg
> endf
>
> fun! Caller(fn, args)
> let afn = a:fn
> return call(afn, a:args)
> endf
>
> call Caller(function('Example'), [1])
> call Caller('Example', [1])
It's a matter of name spaces. Inside a dictionary there is no conflict
with Vim functions. In the global namespace Vim functions start with a
lower case character, user functions with an upper case character.
That's completely consistent.
--
I am also told that there is a logical proof out there somewhere
that demonstrates that there is no task which duct tape cannot handle.
-- Paul Brannan
/// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ download, build and distribute -- http://www.A-A-P.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///