1. ZyX_I
  2. frawor


ZyX_I  committed 6e8b3c2

@/fwc: Made `isfunc' be also a filter that transforms its argument into a function reference

  • Participants
  • Parent commits fd4b852
  • Branches default
  • Tags release-0.1.15

Comments (0)

Files changed (6)

File doc/FWC.txt

View file
  • Ignore whitespace
     You can't check for floating-point values if vim is compiled without 
     |+float| feature.
-isfunc {one}   (|FWC-{one}|)                                    *FWC-c-isfunc*
+isfunc {one}   (|FWC-{one}|)                     *FWC-f-isfunc* *FWC-c-isfunc*
     Checker: checks whether argument is a name of a callable function or 
              a callable function reference. If optional argument is 1, then 
              only function references are allowed.
              Names of dictionary items are also allowed, but only if they 
              start with scope prefix and do use only dotted subscripts 
+    Filter: checks argument with above rules and if check succeeds, transforms 
+            it into a function reference (unless it is a reference already).
 isreg                                                            *FWC-c-isreg*
     Checker: checks whether argument is a valid regular expression.

File doc/frawor.txt

View file
  • Ignore whitespace
     0.1: (intfuncs-0.1) Added |FWC-c-idof|
     0.2: (intfuncs-0.2) Made |FWC-f-path| filter expand argument
     0.3: (intfuncs-0.3) Added -onlystrings support for |FWC-c-range|
+    0.4: (intfuncs-0.4) Made |FWC-f-isfunc| transform argument to a function 
+                        reference
     0.1: Added |frawor-r-os.path.relpath|
          Made |frawor-r-os.path.normpath| also simplify its argument

File plugin/frawor/fwc.vim

View file
  • Ignore whitespace
 "▶1 Header
 scriptencoding utf-8
-execute frawor#Setup('0.3', {'@/fwc/compiler': '0.0',
+execute frawor#Setup('0.4', {'@/fwc/compiler': '0.0',
             \                '@/decorators'  : '0.0'}, 1)
 "▶1 Define messages
 if v:lang=~?'ru'

File plugin/frawor/fwc/intfuncs.vim

View file
  • Ignore whitespace
 "▶1 Header
 scriptencoding utf-8
-execute frawor#Setup('0.3', {'@/resources': '0.0',
+execute frawor#Setup('0.4', {'@/resources': '0.0',
             \                '@/os':        '0.0',
             \                '@/signs':     '0.0',}, 1)
 let s:r={}
     return self
+function s:r.isfunc.pipe(desc, idx, type)
+    call call(s:r.isfunc.check, [a:desc, a:idx, a:type], self)
+    if !a:desc[1]
+        let curargstr=self.argstr()
+        call self.let(curargstr,
+                    \ '((type('.curargstr.')==2)?'.
+                    \   '('.curargstr.'):'.
+                    \ '((exists('.curargstr.'))?'.
+                    \    '(eval('.curargstr.'))'.
+                    \  ':'.
+                    \    '(function('.curargstr.'))))')
+    endif
+    return self
 "▶1 `isreg'
 " Checks whether {argument} is a valid regular expression
 let s:r.isreg={'args': []}

File test/fwccheck.ok

View file
  • Ignore whitespace
 ::: Section <Pipes/Built-in pipes/tuple>
+::: Section <Pipes/Built-in pipes/isfunc>
 ::: Section <Pipes/Built-in pipes/list>

File test/fwctests.dat

View file
  • Ignore whitespace
 ['run [$[abc def]]',       'filter'], [s:.revstring],       0
 ['earg',                   'filter'], ['string("abc")'],    ["'abc'"]
 ['earg',                   'filter'], ['('],                0
-['isfunc',                 'filter'], [0],                  0
-['isfunc',                 'filter'], [function('tr')],     [function("tr")]
 ['take ={"abc": 1} start', 'filter'], ['a'],                [1]
 ['take ={"abc": 1} start', 'filter'], ['b'],                0
 ['take ={"abc": 1} start', 'filter'], [0],                  0
 ['tuple bool, bool',       'filter'], ['abc'],              0
 ['tuple (?bool |=(!@.@))', 'filter'], [[1]],                [[0]]
 ['tuple (tuple bool tuple bool, bool)', 'filter'], [[[''],[4,0]]], [[[0],[1,0]]]
+#▶3 isfunc
+:let g:Tr=function('tr')
+:let g:d={'tr': function('tr')}
+['isfunc',                 'filter'], [0],                  0
+['isfunc',                 'filter'], [function('tr')],     [function('tr')]
+['isfunc',                 'filter'], ['tr'],               [function('tr')]
+['isfunc',                 'filter'], ['g:Tr'],             [function('tr')]
+['isfunc',                 'filter'], ['g:d.tr'],           [function('tr')]
 #▶3 list
 ['list bool',              'filter'], ["['abc', 'def']"],   0
 ['list bool',              'filter'], [['abc', 'def']],     [[1, 1]]