Am 01.04.2010 04:31, schrieb Ted:
Hello,
   I'm hoping to call a "static" dictionary function using call().  By
"static" I mean that the keyword 'dict' is not used in the function's
definition.  I use this nomenclature in the hopes that the effect of
this keyword is to declare a static member function as is possible in
java/C++/etc, ie to restrict the scope of the function name without
requiring it to be associated with an object.  However this doesn't
seem to work.  For example:

     " Setup:
     let testdict = { }
     funct! testdict.funct()
       echo "called"
     endfunct

     " Tests:
     "   Following each line is an indented comment containing its
     "   output in message land, ie what was echoed.
     call testdict.funct()
       " called
     echo testdict.funct
       " 667
     echo string(testdict.funct)
       " function('667')
     echo function('667')
       " E475: Invalid argument: 667
     echo function('testdict.funct')
       " testdict.funct
     call call(testdict.funct, [ ])
       " E725: Calling dict function without Dictionary: 667

If it wants a dict, then give it a dict:

    call call(testdict.funct, [], {})

     " Same deal if there's an intermediate variable involved.
     let TestdictDotFunct = testdict.funct
     echo TestdictDotFunct
       " 667
     echo string(TestdictDotFunct)
       " function('667')
     call TestdictDotFunct()
       " E725: Calling dict function without Dictionary: 667

    call call(TestdictDotFunct, [], {})

From the help topic *E725*:
   It is also possible to add a function without the "dict" attribute
   as a Funcref to a Dictionary, but the "self" variable is not
   available then.

Applies when the function is global:
    func! GlobalFunc()
        echo exists("self")
    endfunc
    let testdict.onemorefunc = function("GlobalFunc")

So logic would seem to indicate that if "self" is not available, then
it should be possible to call the function referenced by the Funcref
without a Dictionary.  However this doesn't seem to be the case.  Am I
missing something?

It's because the following implies the dict attribute:

    let testdict = { }
    funct! testdict.funct()
        ...

HTH (no warranty),
Andy

--
You received this message from the "vim_use" 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

To unsubscribe, reply using "remove me" as the subject.

Reply via email to