parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Можно в конфигурации хранить имя класса и конструктора...

Sumo 25.02 09:19 / 25.02 09:19

... и подключать точно зная имена. И мне не надо возиться с рефлексией и одноимёнными классами — явно указываю что и откуда взять на простейшем миниязыке: path/to/package.p@className::constructor.

Выдернул из библиотеки чистый пример:
# use.p:
#!./parser3

@main[]
  $t1[^getClass[./use_package.p@Test1]]
  ^t1.method[]

  $t2[^getClass[./use_package.p@Test2::init;$.var[12345]]]
  ^t2.method[]

@getClass[aClassDef;aOptions] -> [object]
  $lClassDef[^pfString:parseClassDef[$aClassDef]]
  ^if(def $lClassDef.package){
    ^use[$lClassDef.package]
  }

  $result[^reflection:create[$lClassDef.className;^if(def $lClassDef.constructor){$lClassDef.constructor}{create};$aOptions]]

@CLASS
pfString

@OPTIONS
locals
static

@auto[]
  $self.__pfString__[
    $.classDefRegex[^regex::create[^^([^^@:]*)(?:@([^^:]+))?(?::+(.+))?^$]]
  ]

@parseClassDef[aClassDef] -> [$.className $.constructor $.package $.classDef]
## Формат aClassDef: path/to/package.p@className::constructor
  $aClassDef[^aClassDef.trim[]]
  $result[$.classDef[$aClassDef]]
  ^aClassDef.match[$self.__pfString__.classDefRegex][]{
    $result.constructor[^if(def $match.3){$match.3}{create}]
    ^if(def $match.2){
      $result.className[$match.2]
    }{
       $result.className[^file:justname[$match.1]]
     }
    $result.package[^if($match.1 ne $result.className){$match.1}]
  }

#------------
# use_package.p:

@CLASS
Test1

@create[aOptions]

@method[]
  method1


@CLASS
Test2

@init[aOptions]
  $self.var[$aOptions.var]

@method[]
  method2 $self.var